2009-08-01 5 views
6

ich zur Zeit eine Erweiterungsmethode auf System.Windows.Forms.Control wie diese:C#: Hinzufügen von Erweiterungsmethoden auf eine Basisklasse, so dass sie in abgeleiteten Klassen erscheinen

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

Allerdings ist diese Methode nicht erscheinen in Klassen, die von Control abgeleitet sind, z. B. PictureBox. Kann ich eine Erweiterungsmethode erstellen, die nicht nur in Control angezeigt wird, sondern auch für von Control abgeleitete Klassen, ohne dass eine explizite Umwandlung erforderlich ist?

+0

Mögliche Duplikate von [Warum kann ich keine Erweiterungsmethode von einer Basisklasse des erweiterten Typs aufrufen?] (Http://stackoverflow.com/questions/27883427/why-cant-i-call-an- extension-method-from-a-base-Klasse-des-erweiterten-Typs) –

Antwort

13

Sie müssen die using-Anweisung für den Namespace einschließen, in dem Ihre Erweiterungsklasse definiert ist, oder die Erweiterungsmethoden sind nicht im Gültigkeitsbereich.

Erweiterungsmethoden eignen sich gut für abgeleitete Typen (z. B. die Erweiterungsmethoden, die in System.Linq auf IEnumerable<T> definiert sind).

+0

Danke! Es wurde in einem anderen Namespace definiert, indem eine using-Anweisung hinzugefügt wurde. – MiffTheFox

+0

Namespace und Scope, wo die Schlüsselwörter, die mir hier geholfen haben. Vielen Dank! – GregoryBrad

8

Eine Erweiterungsmethode wird tatsächlich auf alle Erben/Implementierungen des Typs angewendet, der erweitert wird (in diesem Fall Control). Sie können versuchen, Ihre using-Anweisungen zu überprüfen, um sicherzustellen, dass der Namespace, auf den sich die Erweiterungsmethode bezieht, auf die Stelle verweist, an der Sie sie aufrufen möchten.

-2

Ich denke, Sie die Erweiterung machen müssen generic:

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

Nein, Sie müssen nicht .. es auch mit dem nicht-generische Version Sie auf dem Laufenden, denken Sie daran, fügen Sie den Namespace arbeiten sollten deine Erweiterungen

1

Sie können auch sicherstellen, dass Ihre Erweiterungen nicht in einem Namespace definiert sind. Jedes Projekt, das auf sie verweist, importiert sie automatisch.

0

Hinweis, dass, wenn ein Verlängerungsverfahren aus einer Eigenschaft in der Klasse aufrufen, die von einer Basisklasse erbt, die die Erweiterungsmethode angewendet wurde, müssen Sie das Erweiterungsmethode Suffix this

z.B.

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

Wo GetValue meine Erweiterungsmethode auf die Basisklasse angewendet wird.

Verwandte Themen