2009-11-23 2 views
2

У меня есть несколько общих классов, которые реализуют общий не общий интерфейс. Я создаю свои общие объекты и добавляю их в список. Как я могу использовать LINQ или любой другой метод, чтобы фильтровать список по типу generic. Мне не нужно знать Т во время выполнения. Я добавил свойство type в интерфейс и использовал 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

+1

Помните, что ковариация и контравариантность в C# 4 применяются только к общим интерфейсам и делегатам, а не к классам и структурам, а аргументы типа должны быть ссылочными типами. Будут ли выполнены все эти критерии в этом примере? –

+0

Не для занятий? Я вполне могу использовать 'ReadonlyList ' с 'ReadonlyList ', не так ли? – Dario

Смежные вопросы