2009-08-01 8 views
6

tengo actualmente un método de extensión en System.Windows.Forms.Control como esto:C#: Adición de métodos de extensión a una clase de base de modo que aparezcan en las clases derivadas

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

Sin embargo, este método no hace aparecer en clases derivadas de Control, como PictureBox. ¿Puedo hacer un método de extensión que aparezca no solo en Control, sino en las clases derivadas de Control, sin tener que hacer un lanzamiento explícito?

+0

duplicado posible de [Por qué no puedo llamar a un método de extensión de una clase base del tipo extendido?] (Http://stackoverflow.com/questions/27883427/why-cant-i-call-an- extension-method-from-a-base-class-of-the-extended-type) –

Respuesta

13

debe incluir el uso de la declaración de espacio de nombres en el que se define la clase de extensiones o los métodos de extensión no será en su alcance.

Los métodos de extensión funcionan bien en tipos derivados (por ejemplo, los métodos de extensión definidas en IEnumerable<T> en System.Linq).

+0

¡Gracias! Se definió en un espacio de nombre diferente, y se lo arregló con una sentencia using. – MiffTheFox

+0

Espacio de nombre y ámbito de las palabras clave que me ayudaron aquí. ¡Gracias! – GregoryBrad

8

un método de extensión realmente aplicarse a todos los herederos/ejecutores del tipo que está siendo extendido (en este caso, de control). Puede intentar verificar sus instrucciones de uso para asegurarse de que se haga referencia al espacio de nombre en el que se encuentra el método de extensión cuando intenta llamarlo.

-2

Yo creo que hay que hacer que la extensión genérica:

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

No, usted no tiene que .. también debería funcionar con la versión no genérica informados, no olvide añadirlo al espacio de nombres para tus extensiones

1

También puede asegurarse de que sus extensiones no están definidos en un espacio de nombres, entonces cualquier proyecto que hace referencia a ellos se auto-importarlos.

0

Nota que si se llama a un método de extensión de una propiedad en la clase que hereda de una clase base que tiene el método de extensión que se le aplica, usted tiene al sufijo el método de extensión con this

por ejemplo,

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

Dónde GetValue es mi método de extensión se aplica a la clase base.

Cuestiones relacionadas