我列出了各种类型的实例(所有这些类型都源自超类型)。我需要得到一个仅包含某些类型或派生实例的子列表。一个简化的示例可以是:

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的列表?

最佳答案

您的参数错误。 IsInstanceOfType需要一个实例作为参数,您在其中传递Type

以下应该工作。

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

10-08 00:27