2015-05-09 41 views
0

我有一些控件从一个通用的基类继承,这个类实现了一个接口IMyInterface获取使用Linq实现接口的控件?

到目前为止,我尝试:

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

然而,上述不返回任何结果,即使它应该。

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

回答

1

考虑下面的扩展方法做:

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接口,使这种事情更简单。

0

你的问题非常短,并没有提供太多的细节和代码片段来显示你到现在为止尝试过什么。我需要的究竟是什么你可能需要一些假设:

List<FormElements> X = List of all form elements including controls derived from the BaseControl 

IEnumerable<BaseControl> result = X.Select(c => { 
              if (c is BaseControl) 
              return c; 
              else return null; 
              }) 
          .where(c => c != null) 

当然,还有更好的方法来做到这一点,我们可以检查控件的类型在哪里块本身,检查每个元素的类型。主要目的是展示我们如何使用LINQ

0
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() 
    { 

    } 

} 
1

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

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

+0

'OfType '。 –