2010-11-19 203 views
5

我想知道如果我可以使用擴展方法或其他技術來擴展靜態類如 System.Net.Mime.MediaTypeNames.Image,它的類型比我需要的少。擴展方法擴展靜態類

+0

您不能擴展靜態類;搜索這個問題的重複,你會看到一些解決方法。 – BeemerGuy 2010-11-19 01:39:40

+0

你爲什麼要這樣做?靜態類沒有上下文,任何你可以在靜態類內部的任何地方都可以在代碼中的「任何地方」完成。 – 2010-11-19 07:42:44

+0

@Amby - 我想你可能只是想爲組織採購做點什麼。當然,你可以用必要的方法創建一個靜態的ImageUtility類(根據這個答案,他將不得不做任何事情),但我認爲OP希望以他不需要額外類的方式組織他的代碼。不幸的是,你不能。 (我來這裏期望做同樣的事情)。 – MattW 2012-08-06 13:52:20

回答

6

不,擴展方法只能用於添加實例方法,而不能用於靜態方法(甚至屬性)。擴展方法實際上只是靜態方法中的句法糖。例如,當您使用的擴展方法如Count():

var list = GetList(); 
var size = list.Count(); 

這實際上編譯:

var list = GetList(); 
var size = Enumerable.Count(list); 

使用擴展方法不能添加額外的靜態方法向現有類。

+0

說「擴展方法只能用於添加實例方法」是否正確?正如你所解釋的那樣,它們只是表現爲實例方法。它們實際上不是實例方法,或者您將能夠訪問該類的非公共成員。 – 2014-07-27 23:01:38

0

不,這在C#中還不可能,儘管希望它在某些時候會變得如此。而且你不能繼承一個靜態類並以這種方式添加新的方法,因爲靜態類必須從object派生。你可以做的一件事是在你的代碼中產生一個非常相似的效果,就是簡單地聲明另一個靜態類,當你需要你的擴展方法時,你會使用它。例如:

public static class MessageBox2 
{ 
    public static DialogResult ShowError(string Caption, string Message, params object[] OptionalFormatArgs) 
    { 
     return MessageBox.Show(string.Format(Message, OptionalFormatArgs), Caption, MessageBoxButtons.OK, MessageBoxIcon.Error); 
    } 
} 

由於原始類是靜態的,通過定義該「擴展」方法並不需要接收實例作爲this參數,並且可以簡單地使用原始類的靜態方法。