我已經定義了一個通用類MultiSlot<T>
。檢查一個對象是否屬於一個通用類
在某些時候,我想檢查一個對象是這種類型(即類型MultiSlot
),但不是特定類型T
。我想要的基本上是MultiSlotl<T>
的所有對象輸入某個if
子句,而不考慮它們的具體T
(假設它們全部屬於T
的某個子類)。
指示性(但錯誤!)語法應該是:if (obj is MultiSlot<>)
。
有沒有辦法做到這一點?
我已經定義了一個通用類MultiSlot<T>
。檢查一個對象是否屬於一個通用類
在某些時候,我想檢查一個對象是這種類型(即類型MultiSlot
),但不是特定類型T
。我想要的基本上是MultiSlotl<T>
的所有對象輸入某個if
子句,而不考慮它們的具體T
(假設它們全部屬於T
的某個子類)。
指示性(但錯誤!)語法應該是:if (obj is MultiSlot<>)
。
有沒有辦法做到這一點?
,看一下 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;
}
請複製/粘貼時[其他答案](http://stackoverflow.com/a/457708/201088)。 – 2013-02-14 13:30:52
你是絕對正確@ErenErsönmez...對不起,錯誤更正。我只是不知道該如何再次找到它......而且,我應該已經開啓了StackOverflow搜索引擎!我的道歉 – Kek 2013-02-14 13:35:13
是的,它工作得很好,thx很多! – yannischris 2013-02-14 13:53:14
可以使用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>
)
我想「循環」加法(在第一個答案中)使代碼適用於子類。日Thnx! – yannischris 2013-02-14 14:00:33
一個不那麼複雜的方法:
var type = obj.GetType();
var isMultiSlot = type.IsGenericType &&
type.GetGenericTypeDefinition() == typeof (MultiSlot<>);
這不會從MultiSlot<T>
繼承類型的工作,雖然。
我想,「while」循環加入(在前面的答案中)使代碼適用於繼承類型。日Thnx! – yannischris 2013-02-14 13:58:28
是的,其他帖子中的版本更好。 – 2013-02-14 13:59:50
是的確的..我在發佈之前搜索過它(但顯然不夠..)。道歉! – yannischris 2013-02-14 14:08:36