【问题标题】:Reflection - how to compare between list of types反射 - 如何在类型列表之间进行比较
【发布时间】:2014-10-24 08:34:43
【问题描述】:

我有一个各种类型的实例列表(所有这些类型都派生自超类型)。我需要获取一个子列表,其中仅包含某些类型或派生的实例。一个简化的例子可以是:

class Program
{
    private class A { }
    private class B : A { }
    private class C : A { }
    private class D : C { }

    static void Main(string[] args) 
    { 
        B b = new B();
        C c = new C();
        D d = new D();

        var typesToHave = new List<Type>();
        typesToHave.Add(typeof(C));

        var result = new List<A>();
        if (typesToHave.Any(t => b.GetType().IsInstanceOfType(t)))
            result.Add(b);
        if (typesToHave.Any(t => c.GetType().IsInstanceOfType(t)))
            result.Add(c);
        if (typesToHave.Any(t => d.GetType().IsInstanceOfType(t)))
            result.Add(d);

    }
}

我希望这里有一个包含 cd 的列表,但它什么也没返回。

另外(但它是次要的)我不知道为什么我不能在 lambda 表达式中使用 isas 运算符,例如:

if (typesToHave.Any(t => d is t))

在上面的示例中,我怎样才能有一个包含cd 的列表?

【问题讨论】:

    标签: c# .net reflection types comparison


    【解决方案1】:

    你的参数错误。 IsInstanceOfType 需要一个实例作为参数,当您传递 Type 时。

    以下应该可以工作。

    if (typesToHave.Any(t => t.IsInstanceOfType(d)))
    

    【讨论】:

      【解决方案2】:

      您可以使用IsAssignableFrom

      if (typesToHave.Any(t => t.IsAssignableFrom(d.GetType()))
      

      要使用isas 运算符,您需要提供Type 名称。不是类​​型实例,这就是这些运算符的工作方式。例如:

      var list = new List<int>();
      var ie = list as IEnumerable<int>;
      

      【讨论】:

      • 是的,这行得通,令人惊讶的是,VS 建议我将IsAssignableFrom 重写为IsInstanceOfType..为什么这行得通而反之不行?为什么我不能使用is 运算符?谢谢
      【解决方案3】:

      这也是一个很好的替代方案:

      if (typesToHave.Any(t => b.GetType().IsSubclassOf(t) || b.GetType() == t))
          result.Add(b);
      if (typesToHave.Any(t => c.GetType().IsSubclassOf(t) || c.GetType() == t))
          result.Add(c);
      if (typesToHave.Any(t => d.GetType().IsSubclassOf(t) || d.GetType() == t))
          result.Add(d);
      

      【讨论】:

      • 这对多嵌套类型也有效吗?例如:d.GetType().IsSubclassOf(typeof(A))?
      • 没关系,我已经检查过了,它可以工作,谢谢你的解决方案
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多