2008-11-03 19 views
42

listening to a talkC#4dynamic关键字,我想知道...这个功能是否正交于其他.NET功能,例如它是否会支持扩展方法?C#4中的动态关键字是否支持扩展方法?

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

注:这个问题是C#4被运这就是为什么它在未来的紧张措辞真实之前问。

+0

真棒问题。我的猜测是“不”,因为他们不是班级的一部分,并且不能通过反思获得。 – TheSoftwareJedi 2008-11-03 15:32:12

+0

我也猜“不”。但我认为这将工作:var x =“Y0”; x.twice(); – 2008-11-03 15:33:45

+0

乔尔,这已经在工作了。改变它将是一个突破性的变化 – Olmo 2008-11-20 17:50:27

回答

47

"New Features in C# 4" word doc

动态查找无法找到 扩展方法。 扩展方法是否适用取决于呼叫 的静态上下文中的 (即哪些使用条款发生),以及 当前保持的有效载荷的一部分是否为 。

2

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

4

这工作,我觉得有趣,至少...

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

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

不过,如果编译器在编译时查找正确的扩展方法,然后我看不出为什么不能包一个在运行时查看一组扩展方法?这就像非成员方法的v表。

编辑:

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

1

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

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

,并调用它像这样:

ClassWithMyProp x; 
x.MyExt(); 
相关问题