这是我的代码:
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");
如何解决?
提前致谢!
答案 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");