2009-11-23 57 views
2

我有幾個泛型類實現了一個通用的非泛型接口。我創建我的通用對象並將它們添加到列表中。我如何使用LINQ或任何其他方法來按照泛型類型過濾列表。在運行時我不需要知道T.我向接口添加了一個類型屬性,並使用LINQ進行過濾,但我希望使用is運算符。這是一個我扔在一起的簡單例子。使用與泛型接口的運算符

任何想法?

interface IOperation 
    { 
     object GetValue(); 
    } 
    class Add<T> : IOperation 
    { 
     public object GetValue() 
     { 
      return 0.0; 
     } 
    } 
    class Multiply<T> : IOperation 
    { 
     public object GetValue() 
     { 
      return 0.0; 
     } 
    } 


    private void Form1_Load(object sender, EventArgs e) 
    { 
     //create some generics referenced by interface 
     var operations = new List<IOperation> 
     { 
      new Add<int>(), 
      new Add<double>(), 
      new Multiply<int>() 
     }; 

     //how do I use LINQ to find all intances off Add<T> 
     //without specifying T? 

     var adds = 
      from IOperation op in operations 
      where op is Add<> //this line does not compile 
      select op; 
    } 

回答

4

您可以只比較底層的非參數化類型名稱:

var adds = 
    from IOperation op in operations 
    where op.GetType().Name == typeof(Add<>).Name 
    select op; 

注意,在C#的下一個版本,這將是可能的,因爲方差:

var adds = 
    from IOperation op in operations 
    where op is Add<object> 
    select op; 
+0

+ 1先生。做得好! – Steve 2009-11-23 17:52:33

+1

請記住,C#4中的協變和逆變僅適用於通用接口和委託,而不適用於類和結構,並且類型參數必須是引用類型。在這個例子中所有的標準都會被滿足嗎? – 2009-11-23 21:41:00

+0

不是爲了上課?我可以很好地使用'ReadonlyList ''ReadonlyList ',不能嗎? – Dario 2009-11-24 16:18:47