2013-06-20 40 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() 
)