如何对具有ExpandoObject类型的对象应用扩展方法?

zs2*_*020 1 c# extension-methods expandoobject

这是我的代码:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

dynamic obj = new ExpandoObject();
obj.Add("p1");
Run Code Online (Sandbox Code Playgroud)

怎么解决?

提前致谢!

Jon*_*eet 9

问题是使用dynamic扩展方法 - 两者只是不一起使用.这没关系:

ExpandoObject obj = new ExpandoObject();
obj.Add("p1");
Run Code Online (Sandbox Code Playgroud)

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

从C#5规范的7.6.5.2节:

在其中一个表单的方法调用(第7.5.5.1节)中

expr . identifier ( )
expr . identifier ( args )
expr . identifier < typeargs > ( )
expr . identifier < typeargs > ( args )
Run Code Online (Sandbox Code Playgroud)

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

虽然编译器可以记住using它必须检查以应用扩展方法的指令,但它只是没有 - 可能是出于性能原因,或者也许是因为只是为了相对较少的好处而感觉很多工作.


pho*_*oog 5

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

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

DynamicExtensions.Add(obj, "p1");
Run Code Online (Sandbox Code Playgroud)