当我运行以下代码时:
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);
}
}
这是工作。
为什么第一个代码段不起作用?
答案 0 :(得分:1)
因为Count
方法是IEnumerable<T>
上的扩展方法(一旦调用Where
,您就不再有列表,而是IEnumerable<T>
)。扩展方法不适用于动态类型(至少在C#4.0中)。
动态查找将无法找到扩展方法。扩展方法是否适用取决于调用的静态上下文(即发生使用子句),并且此上下文信息当前不作为有效负载的一部分保留。
答案 1 :(得分:0)
扩展方法是语法糖,允许您调用静态方法,就好像它是一个真正的方法。编译器使用导入的命名空间来解析正确的扩展方法,这是运行时没有的信息。你仍然可以使用扩展方法,你只需要用他们的静态方法形式直接调用它们,如下所示。
var aList = new List<string>{"a", "b", "c"};
dynamic a = aList.Where(item => item.StartsWith("a"));
dynamic b = Enumerable.Count(a);