【问题标题】:How to access items in a dynamic list?如何访问动态列表中的项目?
【发布时间】:2013-05-26 11:10:25
【问题描述】:

我试图弄清楚如何在 .NET 4.5 中枚举动态 LINQ .Select(string selectors) 的结果。动态 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&lt;T&gt;http://msdn.microsoft.com/en-us/library/cc190116.aspx。我看到.Count() 应该是一个有效的扩展方法,但是当我尝试它时它不起作用。事实上,当我尝试时,该页面中的所有方法都不起作用。

我做错了什么?

【问题讨论】:

  • 你是using System.Linq 吗?你需要它,而你的代码没有显示它。
  • 是的。我也在使用它。

标签: c# .net linq dynamic-linq


【解决方案1】:

扩展方法不能像成员方法一样应用于dynamic 对象。

Count()System.Linq.Queryable中定义的扩展方法,你可以直接在你的动态对象上调用它:

Assert.IsTrue(Queryable.Count(hasDynamicProperties.AaData) > 0)

【讨论】:

  • 这很酷。有没有办法可以扩展它以访问hasDynamicProperties[0].aProperty
  • 你能展示一个示例伪代码吗? hasDynamicProperties[0] 是什么类型?
  • 我想通了。 Enumerable.ElementAt(hasDynamicType, 0).AddressCode 其中AddressCodeList&lt;string&gt; fields 中传递给set 方法的字段之一。
  • 非常感谢您帮助我!
猜你喜欢
  • 2020-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-02
  • 1970-01-01
  • 2013-05-07
  • 2020-09-20
相关资源
最近更新 更多