2010-04-07 8 views
38

¿Qué se necesita para que un método de extensión se cumpla cuando existe en un ensamblaje importado? Construí uno en un proyecto de biblioteca de clase pero no está reconocido en mi proyecto web que hace referencia a la biblioteca. Todas las otras clases y métodos en la biblioteca son respetados y visibles, pero este método de extensión no. El método de extensión es visible cuando se usa dentro de la biblioteca.Métodos de extensión no reconocidos

+0

Similar: http://stackoverflow.com/questions/1138848/net-list-distinct –

Respuesta

52

Hacer referencia a un conjunto que contiene una clase con métodos de extensión no es suficiente. Debe importar el espacio de nombres que contiene la clase en cada uno de sus archivos de origen donde desea usar los métodos de extensión.

Por ejemplo, para utilizar LINQ a objetos, es necesario hacer referencia al ensamblado System.Core e importar el System.Linq espacio de nombres (que contiene la clase Enumerable con los métodos de extensión de LINQ):

using System.Linq; 
+0

Tengo instrucciones de uso en mis archivos de clase que hacen referencia a la biblioteca y mi proyecto ya la hace referencia. No estoy seguro de qué más hacer. – ChiliYago

+6

¿Su método de extensión y la clase que contiene el método son públicos? ¿Ha verificado dos veces que no olvidó 'this' en la firma del método? ¿Funciona si no usa la sintaxis del método de extensión para llamar al método? – dtb

+0

Debe averiguar en qué espacio de nombres está implementada la clase de extensión que desea y usar ese espacio de nombres en el código C# donde desea que estén disponibles las extensiones. Tienes que ser muy específico. – dthorpe

14

¿Estás seguro de que el método de extensión se hará público?

+0

sí, la clase está marcada públicamente como el método de extensión. – ChiliYago

+3

¡Ohhhh YESSSSS! Ese fue mi problema! Muchas gracias ! –

12

Si el método de extensión es exigible cuando no se utiliza la sintaxis de extensión, utilice el formato:

this.MyExtensionMethod() 

Eso aclaró mi problema de no encontrar el método de extensión de una clase en VS2010.

+5

Entonces, ¿qué sentido tiene convertirlo en un método de extensión? –

+0

@IanKemp Aún es una sintaxis más limpia que 'MyExtensionMethodsClass.MyExtensionMethod (this)' y le permite intercambiar implementaciones reemplazando su 'using'. Es una especie de inyección de desacoplamiento/dependencia. – binki

+0

@binki Parece la forma menos intuitiva y útil de hacer DI que pueda imaginar. –

1

Para una implementación de ejemplo que me ayudó:

(Nota la palabra clave this que ya se ha mencionado).

/// <summary> 
    /// Convert current bytes to string 
    /// </summary> 
    /// <param name="bytes">Current byte[]</param> 
    /// <returns>String version of current bytes</returns> 
    public static string StringValue(this byte[] currentBytes) 
    { 
     return string.Concat(Array.ConvertAll(bytes, b => b.ToString("X2"))); 
    } 
0

Para cualquiera que se pregunte, tuve este mismo problema, ninguna de las respuestas funcionó. Resulta que era porque la declaración using de la asamblea fue un alias:

using ex = MyApp.Example 

Extracción del alias trabajado, pero en su lugar decidió añadir un duplicado, no alias using, que también fija el problema:

using MyApp.Example 
using ex = MyApp.Example 
0

Tuve este problema al usar un método de extensión en enumeraciones en soluciones referenciadas entre sí como se muestra a continuación. Intellisense funcionó para el método de extensión en el proyecto ApplicationUI e incluso se ejecutó sin errores de compilación o tiempo de ejecución. Pero el método simplemente no funcionó. Además, la ventana inmediata me aseguró que BusinessObjectLib.MyEnum no contenía un método con el nombre de mi método de extensión, y no se pudo encontrar ningún método de extensión.

GenericLib - project where extension method on generic enums is defined 
BusinessObjectLib - project where enums were defined, references GenericLib 
ApplicationUI - project referencing both GenericLib and BusinessObjectLib 

A pesar de que, el Explorador de soluciones veía bien la visualización de todos los proyectos de ApplicationUI, cuando abrí el proyecto BusinessObjectLib, pude ver su referencia a GenericLib fue roto por alguna razón. (Como todo nuestro código, ¿VS también tiene errores?). Primero, trabajé en el proyecto BusinessObjectLib abierto directamente en VS, quité la referencia, luego eliminé el proyecto y luego restauré ambos en el orden opuesto. Luego cambié el nombre del archivo ApplicationUI.sou y lo forcé a ser reconstruido. Pude solucionar este problema con estas acciones, pero solo el cambio de nombre del archivo .sou pareció ser el truco. La ventana inmediata todavía continúa dándome el mismo error, pero al menos el código de tiempo de ejecución funciona nuevamente. Estoy usando este patrón exacto en varios otros proyectos sin tener el tipo de problema que estoy teniendo aquí.

2

Para cualquier persona que aterriza aquí mientras teniendo el mismo problema en VB.NET, tenga en cuenta que no sólo el método de extensión, pero el módulo en sí necesita ser marcado como Public o de lo contrario obtendrá este error. Este es el caso al menos con VS2015 Community y probablemente también sea el caso en otras versiones.

0

En mi caso, el método de extensión estaba en una referencia externa que hacía referencia a una versión diferente de un componente. Yo sincronicé versiones en ambos proyectos y funcionó.

-1

Asegúrese de que si el uso de plantillas, su declaración de plantilla coincide con lo que se declara en la firma del método con "este" ..

Así,

SomeClass<string, string> test = new SomeClass<string, string>(); 

extensionMethod<key, val>(this SomeClass<key, Lazy<val>>, string val) 
{ 
} 

el método de extensión no se mostrará debido la envoltura floja.

+0

No estoy seguro de para qué es -1, pero este fue mi problema y no lo noté de inmediato ya que cambié el tipo en la extensión y olvidé hacerlo en la declaración y el compilador no mostró ningún problema. Tal vez sea porque dije plantillas accidentalmente en lugar de genéricos. pero el punto fue hecho. – eaglei22

Cuestiones relacionadas