2

这是我的代码:

public static class DynamicExtensions

    public static void Add(this ExpandoObject obj, string path){
        dynamic _obj = obj;
        if (_obj == null) throw new ArgumentNullException("obj");
        _obj.path = path;
    }
}

但是当我以这种方式调用它时,我得到了“'System.Dynamic.ExpandoObject'不包含'Add'的定义”的错误:

dynamic obj = new ExpandoObject();
obj.Add("p1");

如何解决?

提前致谢!

4

2 回答 2

12

问题在于使用dynamic扩展方法 - 两者不能一起使用。这会很好:

ExpandoObject obj = new ExpandoObject();
obj.Add("p1");

...但只是dynamic,没有扩展方法支持。

从 C# 5 规范的第 7.6.5.2 节:

在其中一种形式的方法调用(§7.5.5.1)中

expr . identifier ( )
expr . identifier ( args )
expr . identifier < typeargs > ( )
expr . identifier < typeargs > ( args )

如果调用的正常处理未找到适用的方法,则尝试将构造作为扩展方法调用进行处理。如果 expr 或任何 args 具有编译时类型 dynamic,则扩展方法将不适用。

虽然编译器可以记住using它必须检查以应用扩展方法的指令,但它只是没有 - 可能是出于性能原因,或者可能是因为它被认为是大量工作而收益相对较小。

于 2012-09-19T19:47:45.010 回答
5

动态明确排除扩展方法。这是因为该方法是在运行时解析的,而不是编译时解析的。为了正确解析方法调用,DLR 需要有关调用的信息,包括哪些 using 指令有效;没有机制可以做到这一点。有关更多详细信息,请参阅 Eric Lippert 的此答案:https ://stackoverflow.com/a/5313149/385844

当然,您可以使用静态方法调用语法调用该方法:

DynamicExtensions.Add(obj, "p1");
于 2012-09-19T19:47:58.383 回答