我想使用OfType&lt;&gt;来过滤List<ISeries>
中的对象。我的问题是,某些对象是通用接口类型,但它们不是有一个自己共同的继承接口。
我有以下定义:
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或网络上找到有用的信息。谢谢你的帮助!
答案 0 :(得分:5)
您可以使用反射来实现它:
var filteredList = myList.Where(
x => x.GetType()
.GetInterfaces()
.Any(i => i.IsGenericType && (i.GetGenericTypeDefinition() == typeof(ITraceSeries<>))));
答案 1 :(得分:1)
from s in series
where s.GetType().GetGenericTypeDefinition()==typeof(ITraceSeries<>)
select s;