我试图弄清楚如何枚举动态 LINQ .Select(string selectors)
的结果在 .NET 4.5 中。动态linq来自System.Linq.Dynamic
命名空间。
编辑:我还包括 System.Linq
.
我有一个如下所示的方法:
public void SetAaData(List<T> data, List<string> fields)
{
if (data == null || data.Count == 0)
{
return;
}
var dynamicObject = data.AsQueryable().Select("new (" + string.Join(", ", fields) + ")");
_aaData = dynamicObject;
}
如果我单步执行代码,我可以检查 dynamicObject
并枚举它以查看结果(这是正确的)。问题是我现在正在尝试让我的单元测试通过,但我无法访问dynamicObject 中的任何内容。 _aaData
字段定义为类型 dynamic
.
在我的测试方法中,我尝试了以下方法:
var hasDynamicProperties = new MyClass<MyType>();
dgr.SetAaData(data, fields); // data is a List<MyType>
Assert.IsTrue(hasDynamicProperties.AaData.Count > 0);
当我运行此测试时,出现以下错误:
MyTestingClass threw exception:
Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 'System.Linq.EnumerableQuery<DynamicClass1>' does not contain a definition for 'Count'
所以,我尝试将其转换到列表中:
Assert.IsTrue(dgr.AaData.ToList().Count() > 0);
这导致了以下错误:
Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 'System.Linq.EnumerableQuery<DynamicClass1>' does not contain a definition for 'ToList'
所以,然后我查找了System.Linq.EnumerableQuery<T>
这里:http://msdn.microsoft.com/en-us/library/cc190116.aspx 。我看到了这一切.Count()
应该是一个有效的扩展方法,但当我尝试它时它不起作用。事实上,当我尝试使用该页面中的方法时,它们都不起作用。
我做错了什么?
最佳答案
扩展方法不能像成员方法一样应用于动态
对象。
Count()
是在 System.Linq.Queryable
中定义的扩展方法,您可以直接在动态对象上调用它:
Assert.IsTrue(Queryable.Count(hasDynamicProperties.AaData) > 0)
关于c# - 如何访问动态列表中的项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16843572/