使用Linq和动态c#对象

时间:2011-07-13 11:12:21

标签: c# dynamic

当我运行以下代码时:

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);
    }
}

这是工作。

为什么第一个代码段不起作用?

2 个答案:

答案 0 :(得分:1)

因为Count方法是IEnumerable<T>上的扩展方法(一旦调用Where,您就不再有列表,而是IEnumerable<T>)。扩展方法不适用于动态类型(至少在C#4.0中)。

  

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

Will the dynamic keyword in C#4 support extension methods?

答案 1 :(得分:0)

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

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