9

我想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 或网络上找到有用的信息。感谢帮助!

4

2 回答 2

7

您可以使用反射来实现它:

var filteredList = myList.Where(
    x => x.GetType()
          .GetInterfaces()
          .Any(i => i.IsGenericType && (i.GetGenericTypeDefinition() == typeof(ITraceSeries<>))));
于 2011-05-20T11:45:54.880 回答
2
from s in series
where s.GetType().GetGenericTypeDefinition()==typeof(ITraceSeries<>)
select s;
于 2011-05-20T11:41:00.050 回答