我已经定义了一个通用类MultiSlot<T>
。
在某些时候,我想检查对象是否属于此类型(即MultiSlot
类型),但不是特定类型T
。基本上,我想要的是MultiSlotl<T>
的所有对象输入某个if
子句,无论它们是否具体T
(假设它们都属于T
的某个子类) 。
指示性(但错误!)语法为:if (obj is MultiSlot<>)
。
有办法吗?
答案 0 :(得分: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;
}
答案 1 :(得分: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>
答案 2 :(得分:0)
一种不太复杂的方法:
var type = obj.GetType();
var isMultiSlot = type.IsGenericType &&
type.GetGenericTypeDefinition() == typeof (MultiSlot<>);
但是,对于从MultiSlot<T>
继承的类型,这不会起作用。