C#4中的动态关键字是否支持扩展方法?

44

我正在聆听一场有关 C#4dynamic 关键字的讲座,我想知道... 这个特性是否会与其他 .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 发布之前提出的,这就是为什么它用了未来时态的原因。


很棒的问题。我的猜测是“不”,因为它们并不真正属于类,并且无法通过反射获得。 - TheSoftwareJedi
我也猜“不行”。但我认为这个可以:var x =“Y0”; x.twice(); - Joel Coehoorn
Joel,这已经在工作了。更改它将是一个破坏性的变化。 - Olmo
4个回答

48

来自"C# 4中的新特性" Word文档

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


1
好吧,这很奇怪... 突然从三个答案变成了一个。我猜当我删除了我的错误答案时,另一个人也删除了他的“不太正确的答案”... - James Curran
1
Jon,简单说一下为什么动态类型不支持扩展方法的确切原因是什么? - Royi Namir
@RoyiNamir 扩展方法的魔力似乎是编译时构造。在运行时,C#并没有为它可以在命名空间中找到的每个扩展方法携带状态,这是一个性能问题。 - t3dodson

4

这个运作我至少觉得很有趣...

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

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

然而,如果编译器可以在编译时找到正确的扩展方法,那么我不明白为什么它不能打包一组扩展方法以供运行时查找?这就像非成员方法的虚函数表。

编辑:

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


1
你正在调用一个静态类并传递一个字符串... 这应该总是有效的 :) - NicoJuicy
1
当您传递的字符串是 POCO 对象上的动态属性时,实际上这并不起作用。 - PandaWood

2

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


1
你可以为object创建一个扩展方法,并将其分配给dynamic:
public static void MyExt(this object o) {
    dynamic d = o;
    d.myProp = "foo";
}

并像这样调用它:

ClassWithMyProp x;
x.MyExt();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接