如何对具有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"); 

怎么解决?

提前致谢!

问题是使用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指令,但它只是没有 – 可能是出于性能原因,或者也许是因为它只是觉得需要相对较少的好处才能完成很多工作。

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

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

 DynamicExtensions.Add(obj, "p1");