我已经定义了一个泛型类MultiSlot<T>
。
在某些时候,我想检查一个对象是否属于这种类型(即 type MultiSlot
),但不是特定 type T
。基本上,我想要的是MultiSlotl<T>
输入某个if
子句的所有对象,而不管它们的具体T
情况(假设它们都属于 的某个子类T
)。
指示性(但错误!)语法是:if (obj is MultiSlot<>)
.
有没有办法做到这一点?
看看 检查一个类是否派生自一个泛型类:
简短的回答:
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;
}
您可以使用该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>
)
一个不那么复杂的方法:
var type = obj.GetType();
var isMultiSlot = type.IsGenericType &&
type.GetGenericTypeDefinition() == typeof (MultiSlot<>);
但是,这不适用于从 继承的类型MultiSlot<T>
。