我想过滤 List<ISeries>
中的对象使用它们的类型,使用 OfType<>。 我的问题是,有些对象是通用接口(interface)类型,但它们没有自己的公共(public)继承接口(interface)。
我有以下定义:
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 或网络上找到有用的信息。感谢您的帮助!
最佳答案
可以使用反射来实现:
var filteredList = myList.Where(
x => x.GetType()
.GetInterfaces()
.Any(i => i.IsGenericType && (i.GetGenericTypeDefinition() == typeof(ITraceSeries<>))));
关于c# - 如何使用 OfType<> 过滤泛型类型的所有变体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6071325/