如何使用OfType <>过滤到泛型类型的所有变体

Mar*_*cel 6 c# linq generics filter oftype

我想List<ISeries>使用OfType <> 过滤使用其类型的对象.我的问题是,某些对象属于通用接口类型,但它们没有自己的公共继承接口.

我有以下定义:

public interface ISeries
public interface ITraceSeries<T> : ISeries
public interface ITimedSeries : ISeries
//and some more...
Run Code Online (Sandbox Code Playgroud)

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

var filteredList = myList.OfType<ITraceSeries<?>>(); //invalid argument!
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

一个不受欢迎的解决方案是引入一个ITraceSeries继承自的类型ISeries:

public interface ITraceSeries<T> : ITraceSeries
Run Code Online (Sandbox Code Playgroud)

然后,ITraceSeries用作过滤器.但这并没有真正添加新信息,只会使继承链更复杂.

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

Luk*_*keH 5

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

var filteredList = myList.Where(
    x => x.GetType()
          .GetInterfaces()
          .Any(i => i.IsGenericType && (i.GetGenericTypeDefinition() == typeof(ITraceSeries<>))));
Run Code Online (Sandbox Code Playgroud)

  • @Martinho:为了挑剔,技术上类型<I <>>更好地表征为*unbound*泛型类型.类型是打开还是关闭取决于它是否具有任何未取代的类型参数; 例如,I <T []>已绑定但已打开.我<int []>绑定并关闭,我<>未绑定. (5认同)