如何使用OfType 过滤到generics类型的所有变体

我想使用List使用它们的类型过滤List对象。 我的问题是,某些对象属于通用接口类型,但它们没有自己的公共inheritance接口。

我有以下定义:

 public interface ISeries public interface ITraceSeries : ISeries public interface ITimedSeries : ISeries //and some more... 

我的列表包含各种ISeries ,但现在我想只获取ITraceSeries对象,无论它们实际定义的generics类型参数如何,如下所示:

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

我怎样才能做到这一点?

一个不受欢迎的解决方案是引入一个inheritance自ISeries的类型ISeries

 public interface ITraceSeries : ITraceSeries 

然后,使用ITraceSeries作为filter。 但这并没有真正添加新信息,只会使inheritance链更复杂。

在我看来,这似乎是一个常见问题,但我没有在SO或网络上找到有用的信息。 感谢帮助!

您可以使用reflection来实现它:

 var filteredList = myList.Where( x => x.GetType() .GetInterfaces() .Any(i => i.IsGenericType && (i.GetGenericTypeDefinition() == typeof(ITraceSeries<>)))); 
 from s in series where s.GetType().GetGenericTypeDefinition()==typeof(ITraceSeries<>) select s;