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