2013-02-14 141 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

相关问题