2013-06-20 4 views
2

리플렉션 전체에서 이것을 달성하는 방법이 있습니까?
IDictionary<,>IDictionary<int,int>에서 얻으시겠습니까?제네릭 유형을 찾으십시오

내 의도는 다음과 같습니다

typeof(UniqueKeyQuery<,>).IsAssignableFrom(query.GetType()) 

'쿼리'반면 유형 UniqueKeyQuery<Sometype,int>이다.
이름을 비교하고 싶지 않습니다. UniqueKeyQuery를 확장 가능하게 만들고 싶습니다. (. 예를 들어, query) 당신의 "개방"제네릭 형식을 원하는 경우

답변

1

당신은

typeof(UniqueKeyQuery<,>).IsAssignableFrom(query.GetType().GetGenericDefitition()) 

을 시도 할 수 있습니다, 당신이 할 수있는 이것을 사용하십시오 (정적 클래스에 있어야하는 정적 확장 메서드)

public static bool IsOrInheritsGenericDefinition(this Type ThisType, Type GenericDefinition, out Type DefinitionWithTypedParameters) 
    { 
     DefinitionWithTypedParameters = ThisType; 

     while (DefinitionWithTypedParameters != null) 
     { 
      if (DefinitionWithTypedParameters.IsGenericType) 
      { 
       if (DefinitionWithTypedParameters.GetGenericTypeDefinition() == GenericDefinition) 
        return true; 
      } 

      DefinitionWithTypedParameters = DefinitionWithTypedParameters.BaseType; 
     } 

     return false; 
    } 

:

Type QueryType; 
query.GetType().IsOrInheritsGenericDefinition(typeof(UniqueKeyQuery<,>), out QueryType); 
+0

유형 매개 변수없이 제네릭 형식을 할당 할 수 없기 때문에 IsAssignableFrom이 작동하지 않는다고 생각합니다. 어쩌면 내가 그 코드를 작성한 이유 일 수 있습니다. –

+0

구현이 매력처럼 작동했습니다. 고맙습니다. UniqueKeyQuery에서 상속 받았을 때 유효성 검사를 위해 많은 생각을 했었습니다.이 새로운 클래스는 일반적인 것이 아닙니다. –

2

GetGenericTypeDefinition 작동합니다 : 그것은 작동하지 않는 경우

typeof(UniqueKeyQuery<,>).IsAssignableFrom(
    query.GetType().GetGenericTypeDefinition() 
) 
관련 문제