una método metodos metodo matematicas llamar genérica extensión estática definirse debe clases clase c# extension-methods override

metodos - ¿Hay alguna forma en C#para anular un método de clase con un método de extensión?



metodo de extensión matematicas (3)

No; un método de extensión nunca tiene prioridad sobre un método de instancia con una firma adecuada, y nunca participa en el polimorfismo ( GetHashCode es un método virtual ).

Ha habido ocasiones en las que me gustaría anular un método en una clase con un método de extensión. ¿Hay alguna manera de hacer eso en C #?

Por ejemplo:

public static class StringExtension { public static int GetHashCode(this string inStr) { return MyHash(inStr); } }

Un caso en el que he querido hacer esto es poder almacenar un hash de una cadena en una base de datos y hacer que todas las clases que usan el hash de la clase de cadena (es decir, el diccionario, etc.) usen ese mismo valor. no se garantiza que el algoritmo de hash .NET incorporado sea compatible desde una versión del Framework al siguiente, quiero reemplazarlo con el mío propio.

Hay otro caso en el que me he encontrado donde quisiera sobrescribir un método de clase con un método de extensión, así que no es solo específico para la clase de cadena o el método GetHashCode.

Sé que podría hacerlo subclasando una clase existente, pero sería útil poder hacerlo con una extensión en muchos casos.


Por lo que yo sé, la respuesta es no, porque un método de extensión no es una instancia. Para mí, es más como una facilidad intellisense que te permite llamar a un método estático usando una instancia de una clase. Creo que una solución a su problema puede ser un interceptor que intercepta la ejecución de un método específico (por ejemplo, GetHashCode ()) y hacer otra cosa. Para usar dicho interceptor (como el que proporciona Castle Project), todos los objetos deben ser instalados usando un fábrica de objetos (o un contenedor IoC en Castle) para que sus interfaces puedan ser interceptadas a través de un proxy dinámico generado en tiempo de ejecución. (Caslte también le permite interceptar miembros virtuales de clases)


Si el método tiene una firma diferente, entonces se puede hacer, por lo que en su caso: no.

De lo contrario, debe usar la herencia para hacer lo que está buscando.