2009-03-12 7 views
5

Estoy tratando por primera vez para crear un método de extensión y estoy teniendo algunos problemas ... tal vez ustedes puede ayudar :)de error del compilador método personalizado referencia a la extensión C#

public static class Extentions 
    { 
     public static int myMethod(this MyClass c) 
     { 
       return 1; 
     } 
    } 

entonces cuando lo hago "MyClass.myMethod" obtengo q el error del compilador dice que el método no existe ...

¿Por qué es eso?

Respuesta

19

Primero, necesita una directiva "using" para incluir el espacio de nombres que incluye su clase con los métodos de extensión.

Segundo - re "MyClass.myMethod" - Los métodos de extensión trabajan en casos, no como algo estático - así que más necesita:

MyClass foo = ... 
int i = foo.myMethod(); // translates as: int i = Extentions.myMethod(foo); 

Por último - si desea utilizar el método de extensión en el interior MyClass (o una subclase), Hace falta un programa explícito this - es decir

int i = this.myMethod(); // translates as: int i = Extentions.myMethod(this); 

Este es uno de los pocos casos en los que la materia this s.

+0

Solo por curiosidad, ¿por qué habría una necesidad de llamar a un método de extensión dentro de una clase?Si está codificando la clase, ¿por qué este método es una extensión en primer lugar? ¿No debería ser solo parte de la clase en sí? (Entiendo que lo hayas publicado para mostrar la sintaxis, pero estoy muy contento). – BFree

+0

La clase podría implementar una interfaz, con el método de extensión definido para esa interfaz. O el código podría estar en una subclase, con el método de extensión definido (por separado) contra la clase base, quizás en un ensamblaje diferente a la clase base. –

+0

Re este último; Yo uso este enfoque yo mismo para proporcionar extensiones de C# 3.0/.NET 3.5 a una biblioteca que sea .NET 2.0, es decir, para permitir el uso de lambda en lugar del nombre de usuario. –

6

¿Incluyó el espacio de nombres donde se define su extensión? Me he quemado por eso antes.

Y una forma de evitar tener que agregar el espacio de nombres donde se encuentra su extensión para definir la extensión en ese espacio de nombres. Esta no es una buena práctica, aunque

5

¿Importó (using cláusula al principio) el espacio de nombres en el que Extensions clase es?

using Myself.MyProduct.MyNamespace; 
+0

Se encuentran en el mismo espacio de nombres – Sergio

1

¿Hay algún motivo que obligue a utilizar Extension methods?

Sólo debe ser el uso de métodos de extensión si no se puede añadir el método de la fuente original y no se puede ampliar la clase con una sub-clase (si se declara sealed)

La página en métodos de extensión Unidos:

En general, recomendamos que implemente métodos de extensión con moderación y solo cuando sea necesario. Siempre que sea posible , el código de cliente que debe ampliar un tipo existente debe hacerlo por creando un nuevo tipo derivado del tipo existente . Para obtener más información, ver Inheritance (C# Programming Guide).

Aquí hay incluso más información sobre classes y polymorphism.

Si no es posible extender la clase, siga las otras respuestas con respecto a la directiva using y la instancia methods frente a static methods.

+0

Necesito métodos de extensión porque no puedo cambiar ese ensamblaje en particular. – Sergio

+0

¿La clase también está sellada, impidiendo que la subclasifique? –

Cuestiones relacionadas