2012-09-02 2 views
71

내가있는 경우 :Object를 실제 유형으로 변환하는 방법은 무엇입니까?

void MyMethod(Object obj) { ... } 

이 어떻게 실제 유형이 무엇인지에 obj 캐스팅 할 수 있습니까? 실제의 형태로 주조

+2

컴파일시 알려진 형식입니까? – psubsee2003

+1

그리고 이것으로 무엇을 성취 할 것으로 예상합니까? 달성하려는 방법보다는 달성하고자하는 것을 알려주십시오. –

+0

@JonSkeet : 개체에서 함수를 호출 할 수 있기를 원합니다. 현재 obj.MyFunction();은 실제 객체가 그 함수를 가지고 있음을 알고 있지만 컴파일되지 않습니다. –

답변

117

당신이 다음 단지, 실제 유형을 알고있는 경우 :

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(); 
+0

Swift에서 동일한 구문은 무엇입니까? – Rao

+1

Nevermind, 타입 캐스팅의 경우 'as'및 인스턴스 유형을 확인하는'type (of : ClassName) '함수를 찾았습니다. – Rao

0

은 간단합니다 :

void MyMethod(Object obj) { 
    ActualType actualyType = (ActualType)obj; 
} 
+4

매우 재미 있습니다 ... – Steve

+1

이것은 비논리적입니다. 실제 유형을 실제로 알지 못합니다. 어떻게 그걸해야하니? –

28

나는 생각하지 않는다 :

  • 반사
  • 구현 예를 들어

  • 동적 잘 알려진 인터페이스 : 대신 중 하나를 사용하는 것 당신은 (반사없이) 할 수 있습니다, 당신은 당신의 함수에 타입을 제공해야합니다 :

    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; 
         ... 
        } 
    } 
    
  • +1

    이것은 정말 쓸데없는 대답이며, 최대 득표를 할 가치가 없습니다. OP 유형의 객체를 리플렉션하면 OP의 요청에 따라 객체의 "실제 유형"이 산출되지 않습니다. 또한 MyMethod 논리에는 결함이 있습니다. obj는 유형 A가 될 수 있고 유형 B가 될 수도 있기 때문입니다. 논리는 "실제 유형"(OP가 요청한대로)을 제공하지 않습니다. 호환 유형을 제공하지만 반드시 그런 것은 아닙니다 그것에서 원하는 유형. – Jazimov

    0
    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); 
    } 
    
    0

    시도

    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(); 
    } 
    
    0

    캐스트를 이제 경우 유형을 그 abc라는 클래스에서 지향합니다. 이 방법으로 함수를 호출 할 수 있습니다 :

    (abc)(obj)).MyFunction(); 
    

    을 당신이 다른 방법으로 수행 할 수있는 기능을 모르는 경우. 항상 쉽지는 않습니다. 그러나 당신은 그것의 서명에 의해 어떤 식 으로든 그것을 찾을 수 있습니다. 이것이 사실이라면 저희에게 알려주십시오.

    0

    필자의 경우 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

    관련 문제