0

我已经定义了一个泛型类MultiSlot<T>

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

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

有没有办法做到这一点?

4

3 回答 3

4

看看 检查一个类是否派生自一个泛型类

简短的回答:

    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;
    }
于 2013-02-14T13:10:26.640 回答
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>

于 2013-02-14T13:12:17.063 回答
0

一个不那么复杂的方法:

var type = obj.GetType();
var isMultiSlot = type.IsGenericType && 
                  type.GetGenericTypeDefinition() == typeof (MultiSlot<>);

但是,这不适用于从 继承的类型MultiSlot<T>

于 2013-02-14T13:12:48.567 回答