如何使用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;