C# 如何使用OfType筛选到泛型类型的所有变体<&燃气轮机;
我想使用对象的类型和OfType过滤C# 如何使用OfType筛选到泛型类型的所有变体<&燃气轮机;,c#,linq,generics,filter,oftype,C#,Linq,Generics,Filter,Oftype,我想使用对象的类型和OfType过滤列表中的对象。我的问题是,有些对象属于通用接口类型,但它们没有自己的公共继承接口。 我有以下定义: public interface ISeries public interface ITraceSeries<T> : ISeries public interface ITimedSeries : ISeries //and some more... 我该怎么做? 一种不受欢迎的解决方案是引入一种从ISeries继承的类型ITraceSeries
列表中的对象。
我的问题是,有些对象属于通用接口类型,但它们没有自己的公共继承接口。
我有以下定义:
public interface ISeries
public interface ITraceSeries<T> : ISeries
public interface ITimedSeries : ISeries
//and some more...
我该怎么做?
一种不受欢迎的解决方案是引入一种从ISeries继承的类型ITraceSeries
:
public interface ITraceSeries<T> : ITraceSeries
公共接口ITraceSeries:ITraceSeries
然后,使用ITraceSeries作为过滤器。但这并没有真正添加新信息,只会使继承链更加复杂
在我看来,这似乎是一个常见的问题,但我没有在SO或web上找到有用的信息。谢谢你的帮助 来自串联的s
from s in series
where s.GetType().GetGenericTypeDefinition()==typeof(ITraceSeries<>)
select s;
其中s.GetType().GetGenericTypeDefinition()==typeof(ITraceSeries)
选择s;
您可以使用反射来实现:
var filteredList = myList.Where(
x => x.GetType()
.GetInterfaces()
.Any(i => i.IsGenericType && (i.GetGenericTypeDefinition() == typeof(ITraceSeries<>))));
var filteredList=myList.Where(
x=>x.GetType()
.GetInterfaces()
.Any(i=>i.IsGenericType&&(i.GetGenericTypeDefinition()==typeof(ITraceSeries)));
考虑一下myList.OfType
的返回类型应该是什么。它应该是IEnumerable。但这是一个很好的观点,如何告诉OfType方法呢!?OfType的返回类型与type参数相同。@Martinho Nit:它返回类型参数的IEnumerable好主意,但它的工作方式与此不同,因为typeof(ITraceSeries)!=类型(ITraceSeries)
。修正了它。:-)很多答案只是想法-正确解决方案的方向。谢谢您的更正。@Martinho:这仍然行不通,因为GetType
将返回一个具体的运行时类型,而该类型永远不会是ITraceSeries
,它将是ITraceSeries
的具体实现。请看我的答案,找到一个应该满足OP要求的解决方案。很棒的东西!然而,我想,我可以减少复杂性。。。现在,我的复杂性隐藏在一个远程空间中,而不是在继承结构中!:-)你能告诉我什么类型的(ITraceSeries)实际返回类型吗?据我所知,泛型类型类不共享公共基类。(这首先是我的麻烦之源)@Marcel:typeof(ITraceSeries)
为ITraceSeries
返回一个开放的泛型类型。您不能声明该类型的对象,但可以使用它来创建封闭类型,如ITraceSeries
@Martinho:为了挑剔,从技术上讲,typeof最好被描述为未绑定的泛型类型。一个类型是打开的还是关闭的取决于它是否有任何未替换的类型参数;例如,我是被束缚的,但是是开放的。我被束缚和封闭,我被释放。
var filteredList = myList.Where(
x => x.GetType()
.GetInterfaces()
.Any(i => i.IsGenericType && (i.GetGenericTypeDefinition() == typeof(ITraceSeries<>))));