【问题标题】:Check that an object belongs to a generic class [duplicate]检查对象是否属于通用类[重复]
【发布时间】:2013-01-30 07:11:57
【问题描述】:

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

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

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

有没有办法做到这一点?

【问题讨论】:

  • 确实是的.. 我在发布之前搜索了它(但显然还不够..)。道歉!

标签: c# generics


【解决方案1】:

看看 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;
    }

【讨论】:

  • 复制/粘贴时请cite另一个答案。
  • 你是绝对正确的@Eren Ersönmez...抱歉,错误已更正。我只是不知道如何再次找到它......好吧,我应该信任 StackOverflow 搜索引擎!我的道歉
  • 是的,效果很好,非常感谢!
【解决方案2】:

一种不那么复杂的方法:

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

不过,这不适用于从 MultiSlot&lt;T&gt; 继承的类型。

【讨论】:

  • 我想“while”循环添加(在前面的答案中)使代码适用于继承的类型。谢谢!
  • 是的,其他帖子中的版本更好。
【解决方案3】:

你可以使用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&lt;string&gt;

【讨论】:

  • 我想“while”循环添加(在第一个答案中)使代码适用于子类。谢谢!
猜你喜欢
  • 2011-05-16
  • 2020-06-15
  • 1970-01-01
  • 2023-04-09
  • 2013-12-26
  • 2011-01-13
  • 1970-01-01
  • 1970-01-01
  • 2014-05-08
相关资源
最近更新 更多