C# concat/merge 的动态类型变量
C# concat/merge of dynamic type variables
在 for 循环中,我从数据库接收动态类型的结果
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'
我找不到解决办法。你怎么能这样做?谢谢!
问题是动态类型和扩展方法不能很好地协同工作(阅读 explanation of Eric Lippert on the why)。您必须自己调用扩展方法作为静态方法(实际上是这样):
var l = Enumerable.Concat(results, queryResults);
Concat 是一种扩展方法。扩展方法是一种编译器语法糖。本质上,编译器根据您调用扩展方法的对象的静态类型选择适当的静态方法来调用。但是动态变量没有静态类型,所以编译器无法搜索扩展方法。
编辑:Patrick Hofman 的解决方案应该可行,但不能很好地与扩展方法一起工作的不是 LINQ。事实上,LINQ 严重依赖于扩展方法。问题是 LINQ 假定变量的静态类型(实际上是使用 LINQ 的真正原因:让编译器验证您的代码以确保类型安全)
在 for 循环中,我从数据库接收动态类型的结果
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'
我找不到解决办法。你怎么能这样做?谢谢!
问题是动态类型和扩展方法不能很好地协同工作(阅读 explanation of Eric Lippert on the why)。您必须自己调用扩展方法作为静态方法(实际上是这样):
var l = Enumerable.Concat(results, queryResults);
Concat 是一种扩展方法。扩展方法是一种编译器语法糖。本质上,编译器根据您调用扩展方法的对象的静态类型选择适当的静态方法来调用。但是动态变量没有静态类型,所以编译器无法搜索扩展方法。
编辑:Patrick Hofman 的解决方案应该可行,但不能很好地与扩展方法一起工作的不是 LINQ。事实上,LINQ 严重依赖于扩展方法。问题是 LINQ 假定变量的静态类型(实际上是使用 LINQ 的真正原因:让编译器验证您的代码以确保类型安全)