我已经定义了一个通用类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