2009-08-01 7 views
6

Obecnie mam metodę rozszerzenia na System.Windows.Forms.Control takiego:C#: Dodanie metody rozszerzenie do klasy bazowej, dzięki czemu pojawiają się one w klasach pochodnych

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

Jednak metoda ta nie pojawiają się w klasach pochodnych od Control, takich jak PictureBox. Czy mogę stworzyć metodę rozszerzenia, która pojawia się nie tylko w Control, ale w klasach pochodnych Control, bez konieczności wykonywania wyraźnej obsady?

+0

Możliwy duplikat [Dlaczego nie mogę wywołać metody rozszerzającej z klasy bazowej rozszerzonego typu?] (Http://stackoverflow.com/questions/27883427/why-cant-i-call-an- extension-method-from-a-base-class-of-the-extended-type) –

Odpowiedz

13

Należy dołączyć instrukcję using dla przestrzeni nazw, w której zdefiniowana jest klasa rozszerzeń lub metody rozszerzeń nie będą znajdować się w zakresie.

Metody rozszerzeń działają poprawnie na typach pochodnych (np. Metody rozszerzeń zdefiniowane w IEnumerable<T> w System.Linq).

+0

Dziękujemy! Został on zdefiniowany w innym obszarze nazw, co dodało go w instrukcji using. – MiffTheFox

+0

Przestrzeń nazw i zakres słów kluczowych, które pomogły mi tutaj. Dziękuję Ci! – GregoryBrad

8

Metoda rozszerzenia dotyczy rzeczywiście wszystkich spadkobierców/implementatorów typu, który jest przedłużany (w tym przypadku kontrola). Możesz spróbować sprawdzić swoje instrukcje użycia, aby upewnić się, że przestrzeń nazw, do której należy metoda rozszerzenia, jest przywoływana tam, gdzie próbujesz ją wywołać.

-2

Chyba trzeba zrobić rozszerzenie Generic:

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

Nie, nie trzeba .. powinien również pracować z nie-generycznej wersji opublikowanej, należy dodać przestrzeń nazw dla twoje rozszerzenia.

1

Można również upewnić się, że rozszerzenia nie są zdefiniowane w przestrzeni nazw, a następnie każdy projekt, który się do nich odwołuje, automatycznie je zaimportuje.

0

Uwaga, że jeśli nazywamy metodę rozszerzenia z nieruchomości w klasie, która dziedziczy z klasy bazowej, która ma metodę rozszerzenia zastosowany do niej, trzeba sufiks metodę rozszerzenia z this

np

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

Gdzie GetValue jest moja metoda rozszerzenie zastosowane do klasy bazowej.