Как отфильтровать все варианты универсального типа, используя OfType <> - PullRequest
6 голосов
/ 20 мая 2011

Я хочу фильтровать объекты в List<ISeries>, используя их тип, используя OfType <>. Моя проблема в том, что некоторые объекты имеют общий тип интерфейса, но у них нет общего наследуемого интерфейс свой.

У меня есть следующие определения:

public interface ISeries
public interface ITraceSeries<T> : ISeries
public interface ITimedSeries : ISeries
//and some more...

Мой список содержит все виды ISeries, но теперь я хочу получить только объекты ITraceSeries, независимо от их фактически определенного параметра универсального типа, например так:

var filteredList = myList.OfType<ITraceSeries<?>>(); //invalid argument!

Как я могу это сделать?

Неблагоприятным решением было бы ввести тип ITraceSeries, который наследуется от ISeries:

public interface ITraceSeries<T> : ITraceSeries

Затем используйте ITraceSeries в качестве фильтра. Но это не добавляет новой информации, а только усложняет цепочку наследования.

Мне кажется, что это общая проблема, но я не нашел полезной информации в SO или в Интернете. Спасибо за помощь!

Ответы [ 2 ]

5 голосов
/ 20 мая 2011

Вы можете использовать отражение для достижения этого:

var filteredList = myList.Where(
    x => x.GetType()
          .GetInterfaces()
          .Any(i => i.IsGenericType && (i.GetGenericTypeDefinition() == typeof(ITraceSeries<>))));
1 голос
/ 20 мая 2011
from s in series
where s.GetType().GetGenericTypeDefinition()==typeof(ITraceSeries<>)
select s;
...