2011-03-05 3 views
1

편집 : 잘못된 용어 상자를 캐스팅으로 변경했습니다. I 유형 조치 또는 Func을 새로운 대표가 위임의 형태로 주조한다을 작성하는 경우런타임시 일반 오브젝트를 동적으로 캐스팅하는 C#

:

나는 다음과 같은 문제가있다.

var @delegate = Delegate.CreateDelegate(type, @object, methodInfo); 

하지만 일반 클래스의 경우 올바른 캐스팅 된 개체가 필요합니다.

다음 예제 고려 : 이것은 주조 객체 (@delegate)의 유형은 이후

class Example<T> { 
    Type GenericType() { 
     return typeof(T); 
    } 
} 

static Example<T> Create<T>(T @delegate) { 
    return new Example<T>(); 
} 

Example.Create(@delegate).GenericType(); 

는 형식으로 위임을 반환합니다.

하나 개의 솔루션과 같이 대리자를 투영 할 수 있습니다 :

if(@delegate is Action) 
    Example.Create((Action)@delegate).GenericType(); 

그러나 Delegate.CreateDelegate는 액션이나 Func을 대표을 만들 수 있기 때문에

, 모든 변화를 확인하는 것은 불가능합니다.

일반 클래스를 변경할 수 없으므로 대리자를 캐스팅해야합니다.

나는 내 문제를 설명 할 수 있었으면 좋겠다. 나는 영어 원어민이 아니다 ...

편집 : 문제는 typeof (T)가 "실제"유형의 객체를 반환하지 않는다는 것입니다. 그러나 나는 해결책이 없다는 것을 두려워합니다.

+6

정말 위임자와 함께 작업해야합니까? @delegate 및 @object 사용을 중지하십시오. 예약 된 이름을 shortcuting한다는 것을 알기 전에 잠시 쳐다 보았습니다. – Euphoric

+0

이것은 매우 나 빠졌습니다 시작합니다. 값 형식 값만 boxed되고 대리자 형식은 참조 형식이므로 수행하려는 작업이 확실하지 않지만 Delegate.DynamicInvoke() 메서드를 사용하여 런타임에 바인딩 된 대리자 개체를 호출하십시오. –

+0

C#에서 "delegate"또는 "object"와 같은 바로 가기를 사용하면 클래스가 낙타로 변환되어야하므로 내 복수 {^ 예, 위와 같은 대리자와 작업해야합니다. ( – jhlllnd

답변

0

제 질문에 대답하려면 : 불가능합니다. :

0

델리게이트의 실제 유형을 얻으려면 @delegate.GetType()의 문제점은 무엇입니까?

사이드 노트 : 당신은 "권투"라는 용어를 오용하고 있습니다.

+0

@delegate 변수에 액세스 할 수 없습니다.이 예에서는 실수였습니다. – jhlllnd

+1

리플렉션을 사용하지 않는 한 타입 객체로 동적으로 캐스트 할 수 없습니다. 그게 문제입니다. – Femaref

+0

@delegate는 (Delegate) 새 작업 (...)과 유사하므로 Delegate에 박스형으로 표시됩니다. 안 그래요? – jhlllnd

0

당신은 당신이 조금 반사와 추상을해야 할,

Example.Create((dynamic)@delegate).GenericType(); 

당신이 할 수없는 경우 동적

캐스트 4.0 다음 ​​위의 작동하는 경우 .NET 사용 할 수 있습니다.

abstract class Example{ 
     abstract Type GenericType(); 
    } 

    class Example<T>:Example { 
     override Type GenericType() { 
      return typeof(T); 
     } 
    } 

    static Example Create(Delegate @delegate) { 
     return (Example)Activator.CreateInstance(typeof(Example<>).MakeGenericType(new []{@delegate.GetType()})); 
    } 
관련 문제