检查对象是否属于泛型类

时间:2013-02-14 13:08:37

标签: c# generics

我已经定义了一个通用类MultiSlot<T>

在某些时候,我想检查对象是否属于此类型(即MultiSlot类型),但不是特定类型T。基本上,我想要的是MultiSlotl<T>的所有对象输入某个if子句,无论它们是否具体T(假设它们都属于T的某个子类) 。

指示性(但错误!)语法为:if (obj is MultiSlot<>)

有办法吗?

3 个答案:

答案 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>继承的类型,这不会起作用。