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)
怎么解决?
提前致谢!
问题是使用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节)中
Run Code Online (Sandbox Code Playgroud)expr . identifier ( ) expr . identifier ( args ) expr . identifier < typeargs > ( ) expr . identifier < typeargs > ( args )
如果调用的正常处理找不到适用的方法,则尝试将该构造作为扩展方法调用进行处理.如果expr或任何args具有编译时类型dynamic,则扩展方法将不适用.
虽然编译器可以记住using
它必须检查以应用扩展方法的指令,但它只是没有 - 可能是出于性能原因,或者也许是因为只是为了相对较少的好处而感觉很多工作.
动态显式排除扩展方法.这是因为该方法在运行时解决,而不是编译时.要正确解析方法调用,DLR将需要有关调用的信息,该调用包括哪些using指令有效; 没有机制可以做到这一点.有关详细信息,请参阅Eric Lippert的回答:https://stackoverflow.com/a/5313149/385844
当然,您可以使用静态方法调用语法调用该方法:
DynamicExtensions.Add(obj, "p1");
Run Code Online (Sandbox Code Playgroud)