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

标签 c# linq generics filter oftype

我想过滤 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/

相关文章:

sql - LINQ to SQL 输出与预期不同,如何解决?

c# - 该类型必须是引用类型才能将其用作泛型类型或方法中的参数 'T'

Java swing JComboBox无法参数化

java - 如何基于公共(public)字段使用 Jackson 抽象反序列化不同的枚举类型?

c# - Telerik Grid中ajax绑定(bind)数据时如何进行分组和聚合

c# - 在 C# 中使用 Tortoise SVN 插件

c# - ASP.NET Core和Kestrel线程池中的异步处理

c# - 使用 XmlTextWriter 时 Stream 中的截断输出

.net - EnumerableRowCollection<TRow> 类的用途是什么?

linq - 加入 LINQ 以避免显式命名 "new {}"中的属性?