2013-02-14 162 views
0

我已經定義了一個通用類MultiSlot<T>檢查一個對象是否屬於一個通用類

在某些時候,我想檢查一個對象是這種類型(即類型MultiSlot),但不是特定類型T。我想要的基本上是MultiSlotl<T>的所有對象輸入某個if子句,而不考慮它們的具體T(假設它們全部屬於T的某個子類)。

指示性(但錯誤!)語法應該是:if (obj is MultiSlot<>)

有沒有辦法做到這一點?

+0

是的確的..我在發佈之前搜索過它(但顯然不夠..)。道歉! – yannischris 2013-02-14 14:08:36

回答

4

,看一下 Check if a class is derived from a generic class

簡短的回答:

public static bool IsSubclassOfRawGeneric(Type generic, Type toCheck) 
    { 
     while (toCheck != null && toCheck != typeof(object)) 
     { 

      var cur = toCheck.IsGenericType ? toCheck.GetGenericTypeDefinition() : toCheck; 
      if (generic == cur) 
       return true; 
      toCheck = toCheck.BaseType; 

     } 
     return false; 
    } 
+0

請複製/粘貼時[其他答案](http://stackoverflow.com/a/457708/201088)。 – 2013-02-14 13:30:52

+0

你是絕對正確@ErenErsönmez...對不起,錯誤更正。我只是不知道該如何再次找到它......而且,我應該已經開啓了StackOverflow搜索引擎!我的道歉 – Kek 2013-02-14 13:35:13

+0

是的,它工作得很好,thx很多! – yannischris 2013-02-14 13:53:14

0

可以使用Type.GetGenericTypeDefinition()方法,像這樣:

public bool IsMultiSlot(object entity) 
{ 
    Type type = entity.GetType(); 
    if (!type.IsGenericType) 
    return false; 
    if (type.GetGenericTypeDefinition() == typeof(MultiSlot<>)) 
    return true; 
    return false; 
} 

,你可以使用它像:

var listOfPotentialMultiSlots = ...; 
var multiSlots = listOfPotentialMultiSlots.Where(e => e.IsMultiSlot()); 

請注意,這將返回false的子類的一個實例(即StringMultiSlot : MultiSlot<string>

+0

我想「循環」加法(在第一個答案中)使代碼適用於子類。日Thnx! – yannischris 2013-02-14 14:00:33

0

一個不那麼複雜的方法:

var type = obj.GetType(); 
var isMultiSlot = type.IsGenericType && 
        type.GetGenericTypeDefinition() == typeof (MultiSlot<>); 

這不會從MultiSlot<T>繼承類型的工作,雖然。

+0

我想,「while」循環加入(在前面的答案中)使代碼適用於繼承類型。日Thnx! – yannischris 2013-02-14 13:58:28

+0

是的,其他帖子中的版本更好。 – 2013-02-14 13:59:50

相關問題