使用Linq处理动态c#对象

本文关键字:对象 动态 处理 Linq 使用 | 更新日期: 2023-09-27 18:02:10

当我运行以下代码时:

var aList = new List<string>{"a", "b", "c"};
dynamic a = aList.Where(item => item.StartsWith("a"));
dynamic b = a.Count();

Microsoft.CSharp.RuntimeBinder。RunTimeBinderException加薪。

但是当我写这样的代码片段时:

public interface IInterface
{
}
public class InterfaceImplementor:IInterface
{
    public int ID = 10;
    public static IInterface Execute()
    {
        return new InterfaceImplementor();
    }
}
public class MyClass
{
    public static void Main()
    {
        dynamic x = InterfaceImplementor.Execute();
        Console.WriteLine(x.ID);
    }
}

工作。

为什么第一个代码片段不工作?

使用Linq处理动态c#对象

因为Count方法是IEnumerable<T>的扩展方法(一旦调用Where,您将不再拥有列表,而是IEnumerable<T>)。扩展方法不能与动态类型一起工作(至少在c# 4.0中)。

动态查找将无法找到扩展方法。扩展方法是否应用取决于调用的静态上下文(即,哪个using子句发生),并且该上下文信息当前没有作为有效负载的一部分保存。

c# 4中的动态关键字会支持扩展方法吗?

扩展方法是语法糖,它允许您像调用真正的方法一样调用静态方法。编译器使用导入的名称空间来解析正确的扩展方法,这是运行时所没有的信息。你仍然可以使用扩展方法,你只需要像下面这样以静态方法的形式直接调用它们。

var aList = new List<string>{"a", "b", "c"};
dynamic a = aList.Where(item => item.StartsWith("a"));
dynamic b = Enumerable.Count(a);