2013-06-20 43 views
2

整个反思有没有办法实现这一点?
IDictionary<int,int>得到IDictionary<,>,每个实例?查找通用类型

我的本意是:

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() 
)