44

我正在听一个关于C#4关键字的演讲dynamic,我想知道......这个功能是否会与其他 .NET 功能正交,例如它是否支持扩展方法?

public static class StrExtension {
    public static string twice(this string str) { return str + str; }
}
...
dynamic x = "Yo";
x.twice(); // will this work?

注意:这个问题是在 C#4 发布之前提出的,这就是为什么它用将来时来表达。

4

4 回答 4

48

来自“C# 4 中的新功能”word doc

动态查找将无法找到扩展方法。扩展方法是否适用取决于调用的静态上下文(即出现哪些 using 子句),并且此上下文信息当前不作为有效负载的一部分保存。

于 2008-11-03T15:33:36.500 回答
4

至少我觉得这很有趣......

public static class StrExtension
{
   public static string twice(this string str) { return str + str; }
}

...
dynamic x = "Yo";
StrExtension.twice(x);

不过,如果编译器可以在编译时找到正确的扩展方法,那么我不明白为什么它不能打包一组扩展方法以在运行时查找?它就像一个用于非成员方法的 v-table。

编辑:

这很酷...... http://www2.research.att.com/~bs/multimethods.pdf

于 2009-11-30T22:39:49.747 回答
2

它不能工作,扩展方法的工作取决于文件中包含的命名空间,据我所知,MSIL 不知道文件和包括命名空间。

于 2008-11-20T17:53:19.980 回答
1

您可以为对象创建扩展方法并将其分配给动态

public static void MyExt(this object o) {
    dynamic d = o;
    d.myProp = "foo";
}

并这样称呼它:

ClassWithMyProp x;
x.MyExt();
于 2013-02-01T17:17:36.313 回答