在for循环中,我收到db作为动态类型的结果
dynamic {system.collections.generic.List<object>}
我需要将这些结果收集到一个变量中。
我尝试定义变量
dynamic results = new List<object>();
然后
var queryResults = _dbManager.Query(query);
results = results.Concat(queryResults);
但我有这个例外:
System.Collections.Generic.List<object> does non contain a definition for 'Concat'
我找不到解决方案。你怎么能这样做?谢谢!
答案 0 :(得分:5)
问题是动态类型和扩展方法不能很好地协同工作(阅读explanation of Eric Lippert on the why)。你必须自己调用扩展方法作为静态方法(它实际上是):
var l = Enumerable.Concat(results, queryResults);
答案 1 :(得分:2)
Concat是一种扩展方法。扩展方法是编译器语法糖。本质上,编译器根据您调用扩展方法的对象的静态类型选择适当的静态方法进行调用。但是动态变量没有静态类型,因此编译器无法搜索扩展方法。
编辑:Patrick Hofman的解决方案应该可行,但LINQ不适用于扩展方法。实际上LINQ严重依赖于扩展方法。问题是LINQ假定变量的静态类型(实际上是使用LINQ的原因:让编译器验证代码的类型安全性)