我有许多从通用基类继承的控件,并且该类实现接口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()
{
}
}