使用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);
}
}
工作。
为什么第一个代码片段不工作?
因为Count
方法是IEnumerable<T>
的扩展方法(一旦调用Where
,您将不再拥有列表,而是IEnumerable<T>
)。扩展方法不能与动态类型一起工作(至少在c# 4.0中)。
c# 4中的动态关键字会支持扩展方法吗?动态查找将无法找到扩展方法。扩展方法是否应用取决于调用的静态上下文(即,哪个using子句发生),并且该上下文信息当前没有作为有效负载的一部分保存。
扩展方法是语法糖,它允许您像调用真正的方法一样调用静态方法。编译器使用导入的名称空间来解析正确的扩展方法,这是运行时所没有的信息。你仍然可以使用扩展方法,你只需要像下面这样以静态方法的形式直接调用它们。
var aList = new List<string>{"a", "b", "c"};
dynamic a = aList.Where(item => item.StartsWith("a"));
dynamic b = Enumerable.Count(a);