2008-11-03 21 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(); 
相關問題