내가있는 경우 :Object를 실제 유형으로 변환하는 방법은 무엇입니까?
void MyMethod(Object obj) { ... }
이 어떻게 실제 유형이 무엇인지에 obj
캐스팅 할 수 있습니까? 실제의 형태로 주조
내가있는 경우 :Object를 실제 유형으로 변환하는 방법은 무엇입니까?
void MyMethod(Object obj) { ... }
이 어떻게 실제 유형이 무엇인지에 obj
캐스팅 할 수 있습니까? 실제의 형태로 주조
당신이 다음 단지, 실제 유형을 알고있는 경우 :
SomeType typed = (SomeType)obj;
typed.MyFunction();
당신이 실제의 형태를 모르는 경우, 다음 : 정말, 아니.
// reflection
obj.GetType().GetMethod("MyFunction").Invoke(obj, null);
// interface
IFoo foo = (IFoo)obj; // where SomeType : IFoo and IFoo declares MyFunction
foo.MyFunction();
// dynamic
dynamic d = obj;
d.MyFunction();
은 간단합니다 :
void MyMethod(Object obj) {
ActualType actualyType = (ActualType)obj;
}
매우 재미 있습니다 ... – Steve
이것은 비논리적입니다. 실제 유형을 실제로 알지 못합니다. 어떻게 그걸해야하니? –
나는 생각하지 않는다 :
void MyMethod(Object obj, Type t)
{
var convertedObject = Convert.ChangeType(obj, t);
...
}
UPD : 이것은 당신을 위해 작동 할 수
: 당신의 MyFunction()
방법은 하나 개의 클래스 (와 그 하위) 만 정의되어있는 경우
void MyMethod(Object obj)
{
if (obj is A)
{
A a = obj as A;
...
}
else if (obj is B)
{
B b = obj as B;
...
}
}
는이것은 정말 쓸데없는 대답이며, 최대 득표를 할 가치가 없습니다. OP 유형의 객체를 리플렉션하면 OP의 요청에 따라 객체의 "실제 유형"이 산출되지 않습니다. 또한 MyMethod 논리에는 결함이 있습니다. obj는 유형 A가 될 수 있고 유형 B가 될 수도 있기 때문입니다. 논리는 "실제 유형"(OP가 요청한대로)을 제공하지 않습니다. 호환 유형을 제공하지만 반드시 그런 것은 아닙니다 그것에서 원하는 유형. – Jazimov
Implement an interface to call your function in your method
interface IMyInterface
{
void MyinterfaceMethod();
}
IMyInterface MyObj = obj as IMyInterface;
if (MyObj != null)
{
MyMethod(IMyInterface MyObj);
}
시도
void MyMethod(Object obj)
{
var o = obj as MyClass;
if (o != null)
o.MyFunction();
}
당신은 당신이 호출 할 함수를 정의 관련이없는 클래스에서 많은 수의, 당신은 인터페이스를 정의하고 클래스가 인터페이스를 정의해야이 예에 대한 실제 유형
interface IMyInterface
{
void MyFunction();
}
void MyMethod(Object obj)
{
var o = obj as IMyInterface;
if (o != null)
o.MyFunction();
}
캐스트를 이제 경우 유형을 그 abc라는 클래스에서 지향합니다. 이 방법으로 함수를 호출 할 수 있습니다 :
(abc)(obj)).MyFunction();
을 당신이 다른 방법으로 수행 할 수있는 기능을 모르는 경우. 항상 쉽지는 않습니다. 그러나 당신은 그것의 서명에 의해 어떤 식 으로든 그것을 찾을 수 있습니다. 이것이 사실이라면 저희에게 알려주십시오.
필자의 경우 AutoMapper가 잘 작동합니다.
AutoMapper는 동적 객체에서 명시 적 구성없이에/매핑 할 수 있습니다 :
public class Foo {
public int Bar { get; set; }
public int Baz { get; set; }
}
dynamic foo = new MyDynamicObject();
foo.Bar = 5;
foo.Baz = 6;
Mapper.Initialize(cfg => {});
var result = Mapper.Map<Foo>(foo);
result.Bar.ShouldEqual(5);
result.Baz.ShouldEqual(6);
dynamic foo2 = Mapper.Map<MyDynamicObject>(result);
foo2.Bar.ShouldEqual(5);
foo2.Baz.ShouldEqual(6);
마찬가지로 당신은 AutoMapper은 속성 이름과 열쇠를 줄 것이다, 객체 사전에서 바로 매핑 할 수 있습니다.
자세한 내용 https://github.com/AutoMapper/AutoMapper/wiki/Dynamic-and-ExpandoObject-Mapping
컴파일시 알려진 형식입니까? – psubsee2003
그리고 이것으로 무엇을 성취 할 것으로 예상합니까? 달성하려는 방법보다는 달성하고자하는 것을 알려주십시오. –
@JonSkeet : 개체에서 함수를 호출 할 수 있기를 원합니다. 현재 obj.MyFunction();은 실제 객체가 그 함수를 가지고 있음을 알고 있지만 컴파일되지 않습니다. –