2009-08-01 10 views
6

ho attualmente un metodo di estensione su System.Windows.Forms.Control simili:C#: Aggiunta di metodi di estensione di una classe base in modo che appaiono nelle classi derivate

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

Tuttavia, questo metodo non fa appaiono su classi derivate da Control, come PictureBox. Posso fare un metodo di estensione che appare non solo in Control, ma per le classi derivate da Control, senza dover fare un cast esplicito?

+0

Possibile duplicato di [Perché non è possibile chiamare un metodo di estensione da una classe base del tipo esteso?] (Http://stackoverflow.com/questions/27883427/why-cant-i-call-an- extension-method-from-a-base-class-of-the-extended-type) –

risposta

13

È necessario includere l'istruzione using per lo spazio dei nomi in cui è definita la classe estensioni oi metodi di estensione non rientrano nell'ambito.

I metodi di estensione funzionano correttamente sui tipi derivati ​​(ad esempio i metodi di estensione definiti su System.Linq IEnumerable<T>).

+0

Grazie! È stato definito in uno spazio dei nomi diverso, aggiungendo un'istruzione using che lo ha risolto. – MiffTheFox

+0

Namespace e Scope dove le parole chiave che mi hanno aiutato qui. Grazie! – GregoryBrad

8

Un metodo di estensione verrà effettivamente applicato a tutti gli eredi/implementatori del tipo che viene esteso (in questo caso, Controllo). Potresti provare a controllare le tue istruzioni using per assicurarti che lo spazio dei nomi in cui si trova il metodo di estensione venga referenziato nel punto in cui stai cercando di chiamarlo.

-2

Credo che bisogna fare l'estensione generica:

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

No, non c'è bisogno di .. dovrebbe funzionare anche con la versione non generica che hai postato, ricordate di aggiungere lo spazio dei nomi per le tue estensioni.

1

Puoi anche assicurarti che le tue estensioni non siano definite in uno spazio dei nomi, quindi qualsiasi progetto che fa riferimento ad esse verrà importato automaticamente.

0

Nota che se si chiama un metodo di estensione da una proprietà nella classe che eredita da una classe di base che ha il metodo di estensione applicata ad esso, è necessario suffisso il metodo di estensione con this

esempio

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

Dove GetValue è il mio metodo di estensione applicato alla classe di base.

Problemi correlati