获取使用LINQ实现接口的控件



我有许多从通用基类继承的控件,并且该类实现接口IMyInterface

到目前为止,我尝试了:

var results = from c in this.Controls.Cast<Control>()
              where c.GetType().GetInterfaces().Contains(typeof(IMyInterface))
              select c as IMyInterface;

但是,即使应该返回任何结果。

如何使用Linq在实现此接口的表单上获取控件列表?

如果我正确理解您,您基本上可以使用:

var results = this.Controls.OfType<BaseGeneric>().ToList();

给定以下扩展方法:

public static class TypeExtensions
{
    public static IEnumerable<Type> BaseTypesAndSelf(this Type type)
    {
        while (type != null)
        {
            yield return type;
            type = type.BaseType;
        }
    }
}

您想要类似的东西:

        var result = from c in this.Controls.Cast<Control>()
                     where c.GetType().BaseTypesAndSelf().Any(t => t.IsGenericType && t.GetGenericTypeDefinition() == typeof(BaseGeneric<>))
                     select c;

您可能希望将BaseGeneric<T>从一些更抽象的BaseGenericBase继承,或者实现一些非生成IBaseGeneric接口,以使此类内容变得更简单。

class Program
{
    static void Main(string[] args)
    {
        A test1 = new A();
        B test2 = new B();
        C test3 = new C();
        List<object> test4 = new List<object>() { test1, test2, test3 };
        List<object> test5 = test4.FindAll(x => x is A).ToList();
    }
}
public class A
{
    public A() { }
}
public class B
{
    public B() {}

}
public class C : A
{
    public C()
        :base()
    {
    }
}

最新更新