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

时间:2012-09-19 19:44:29

标签: 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;
    }
}

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

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

如何解决?

提前致谢!

2 个答案:

答案 0 :(得分:9)

问题是使用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具有编译时类型动态,则扩展方法将不适用。

虽然编译器可以记住它必须检查以应用扩展方法的using指令,但它只是没有 - 可能是出于性能原因,或者可能是因为它只是感觉做了很多工作而收效甚微。

答案 1 :(得分:5)

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

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

DynamicExtensions.Add(obj, "p1");