2015-05-09 8 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 '。 –