c# - 如何访问动态列表中的项目?

标签 c# .net linq dynamic-linq

我试图弄清楚如何枚举动态 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/

相关文章:

linq - 在动态 Linq 中使用 "Single"

c# - 返回 bool 值并重新抛出异常

c# - 如何获取XmlNode的 "real"ChildNodes,忽略空白节点?

c# - 增加 Win7 Aero 主题中 DateTimePicker Calender 的字体大小

c# - 找不到类型或命名空间名称 'async'

c# - Entity Framework - 自动变更检测的优势是什么?

c# - 使用 `ToArray` 方法复制数组

c# - 无法使用 Color.FromArgb 设置透明度(但 Color.Transparent 有效)

java - 通过 TCP java (Android)/C# 进行私钥加密

c# - 使用 lambda 表达式调用字典的键对象的方法