【发布时间】:2014-03-01 15:07:57
【问题描述】:
我正在查询一个数据结构,结果类型是IEnumerable<IEntry>(IEntry 是一个框架接口),每个条目都有一个Data 属性(对象类型),这对我来说很有趣。
我的代码如下所示:
var resultList = framework.QueryAllOfType(queryClause.Type)
.Select(e => e.Data)
.ToList();
deleagte.DynamicInvoke(new[]{resultList});
委托背后的方法如下所示:
void Foo (IEnumerable<SomeType> bar); // if queryClause.Type == typeof(SomeType)
void Foo (IEnumerable<OtherType> bar); // if queryClause.Type == typeof(OtherType)
我非常肯定queryClause.Type 匹配SomeType,当然,.NET 框架不是 ;-)
不幸的是,这意味着 resultList 的类型为 IEnumerable<object>,尽管其中的所有对象都是正确的类型,但我无法调用委托(例外:IEnumerable<object> cannot be converted into IEnumerable<SomeType>)。
我知道为什么会这样,但解决办法是什么?我需要一些类似的东西:
.Select(e => e.Data).Cast(queryClause.Type).ToList() 应该返回一个IEnumerable<queryClause.Type>。 .NET 框架中是否已经存在这样的东西?有没有更好的解决方案?
重要提示:由于两个答案已经误解了我的意图,因此我不能将该类型用作泛型参数,因为它仅在运行时才知道。因此所有Cast<...>()、Select(e =e as ...)等都不起作用。
【问题讨论】:
-
我不明白:您有一个不接受 IEnumerable
-
当然还有更多的委托——都有不同的参数类型(这就是为什么我需要 DynamicInvoke 来调用它们)。
标签: c# .net linq generics ienumerable