2009-08-01 51 views
6

我目前有這樣上System.Windows.Forms.Control的擴展方法:C#:添加擴展方法的基類,使得它們出現在派生類

public static void ExampleMethod(this Control ctrl){ /* ... */ } 

然而,這種方法不出現在從Control派生的類上,如PictureBox。我可以做一個擴展方法,不僅出現在Control中,而且用於派生自Control的類,而不必進行明確的轉換?

+0

[爲什麼我無法從擴展類型的基類調用擴展方法?](http://stackoverflow.com/questions/27883427/why-cant-i-call-an-擴展方法從基類擴展類型) – 2016-11-29 11:31:43

回答

13

您必須在定義擴展類的名稱空間中包含using語句,否則擴展方法將不在作用域中。

擴展方法在派生類型上工作正常(例如,在System.Linq中的IEnumerable<T>上定義的擴展方法)。

+0

謝謝!它是在一個不同的命名空間中定義的,添加一個using語句修復了它。 – MiffTheFox 2009-08-01 23:18:56

8

擴展方法實際上將應用於擴展類型的所有繼承者/實現者(在本例中爲Control)。您可能會嘗試檢查您的使用語句,以確保擴展方法所在的名稱空間在您要調用的名稱空間中被引用。

-2

我認爲你必須使擴展通用:

public static void ExampleMethod<T>(this T ctrl) 
    where T : Control 
{ /* ... */ } 

不,你不必..它還應與您發佈的非通用版本的工作,記得要加的命名空間你的擴展。

1

您還可以確保您的擴展沒有在名稱空間中定義,那麼任何引用它們的項目都會自動導入它們。

0

注意如果調用從類由具有施加到其上的擴展方法的基類繼承的屬性的擴展方法,你有this

例如到後綴擴展方法

public int Value 
{ 
    get => this.GetValue<int>(ValueProperty); 
    set => SetValue(ValueProperty, value); 
} 

其中GetValue是我的擴展方法應用於基類。