2011-04-07 77 views
1

我已經將擴展方法添加到ASP.NET System.Web.UI.Page。 我的應用程序中的每一頁都從這個類繼承。擴展方法 - 必須使用這個關鍵字嗎?

但是,我不能只訪問擴展方法。我必須輸入this.MyMethod();,而不是隻能使用MyMethod()。我認爲this的方法/屬性本質上屬於默認範圍。我不瞭解什麼?或者這是一種擴展方法的細微差別?

回答

5

我以爲 的方法/屬性本身就是默認的 範圍。

他們是。但擴展方法是不是方法this在默認範圍內;它們是通過編譯器提供的語法糖來訪問的靜態方法。

我相信你已經知道這一點,但我只想澄清:如果ExtensionMethod是其範圍目前在你的類的擴展方法,鍵入此:

this.ExtensionMethod(); 

...是一樣的:

SomeStaticClass.ExtensionMethod(this); 

this需要作爲參數ExtensionMethod傳遞。上面的第一種方式,編譯器只是爲你做這個。

當然,他們可能已經實現了不同的東西,以便編譯器將「引入」擴展方法以及類成員放入默認範圍;他們只是簡單地選擇不去。我個人喜歡那樣;但我想這是一個主觀的問題。無論如何,如果你不喜歡輸入this,這只是一個小小的煩惱,對吧?

+0

......因爲定義擴展方法的類是靜態的,所以永遠不能擁有它的實例,因此在方法體中它的使用是無效的。 – 2011-04-07 18:56:27

+1

@保羅:我不認爲這是OP的要求。我相信他想知道爲什麼,如果他在'T'類型的代碼中,並且他在'T'上有一個擴展方法,他必須在'T' *代碼中鍵入'this.MyMethod()'*,而不僅僅是'的MyMethod()'。 – 2011-04-07 18:59:28

+0

*再次閱讀這個問題兩次*你是絕對正確的... :)不是說我的評論是錯誤的,無論如何它只是與這個確切的問題無關。 – 2011-04-07 23:44:19

0

爲了使用擴展方法,你應該聲明:

using Namespace.Where.Extension.Method.Is.Located 

而且不要忘了類,用於保存擴展方法應該是靜態的。

2

這是一個擴展方法的細微差別嗎?

是的。 (正如其他人所解釋的那樣)。

如果你想使用沒有任何限定的方法,那麼你可以創建一個從Page繼承的類幷包含你的方法(當然不包括第一個參數)。然後讓您的應用程序中的每個頁面都從您的新自定義頁面繼承。