2012-09-08 2 views
1

리플렉션을 통해 제네릭 매개 변수의 일반 형식을 가져와야합니다. 그러나 진짜 유형은 아니고 유형 {Name = "T"; 하면 FullName = NULL}리플렉션을 통해 일반 매개 변수의 형식을 얻는 방법

public void Sample<T>(T i, object o) 
{ 
    MethodBase basee = MethodBase.GetCurrentMethod(); 
    Type[] types = basee.GetGenericArguments(); 
} 

하지만 난 반사

을 사용하고 있기 때문에 내가의 typeof (T)를 사용할 수 없습니다 제네릭 인수 형식 유형을 얻기 위해 (반사를 사용하는) 방법이 있나요. 다른 칼로리에서

// in this case i should get (Type) { Name="Int32" ; FullName="System.Int32" } 
myClassObj.Sample(10, new object()); 

, 난 대해서 typeof에 의해 호출 된 메소드를 호출하는 방법을 알고 whant (T) 예 :

// in Il code I see that the compiler use: 
// ldtoken !!T => this should get the RuntimeTypeHandle needed as parameter 
// System.Type::GetTypeFromHandle(valuetype System.RuntimeTypeHandle) 
Type t = Type.GetTypeFromHandle(? ? ?); 

나는 T 일반적인 인수에서 RuntimTypeHandle을 얻을 수있는 방법

+1

왜 'i.GetType()'을 사용할 수 없습니까? 그렇다면 왜 typeof (T)를 사용할 수 없습니까? 그건 int라고 말해 줄거야. – aquinas

+0

값이 null 일 수 있으며 충돌이 발생할 수 있습니다 ... : S –

+1

충분합니다. 그러나 왜 typeof (T)가 아닌가? – aquinas

답변

4

이있는 경우 (나는이 모든 점을 모르는,하지만 그런

public void Sample<T>(T i, object o) 
{ 
    Type t = typeof(T); 
    if (i != null) 
    { 
    t = i.GetType(); 
    } 

    // Do whatever with t 
    Console.WriteLine(t); 
} 

에 대해 당신은 실행시의 형태를 가지고 개체), 그렇지 않으면 당신은 정적 유형 있어요.

+0

+1 (그리고 2000 점을 축하합니다.)하지만 더 간단한 표현을 제안합니다 :'Type t = i == null? typeof (T) : i.GetType();'. – phoog