Saltar al contenido

Cómo anular un método de extensión existente

Hola, tenemos la respuesta a tu pregunta, has scroll y la encontrarás a continuación.

Solución:

ACTUALIZACIÓN: Esta pregunta fue el tema de mi blog en diciembre de 2013. ¡Gracias por la gran pregunta!


Puedes hacer esto, en cierto sentido. Pero debería comenzar hablando brevemente sobre el principio de diseño básico de la resolución de sobrecarga en C#. Toda resolución de sobrecarga se trata, por supuesto, de tomar un conjunto de métodos con el mismo nombre y elegir de ese conjunto el mejor miembro único para llamar.

Hay muchos factores involucrados en determinar cuál es el "mejor" método; diferentes idiomas usan una "mezcla" diferente de factores para resolver esto. C#, en particular, da mucha importancia a la "cercanía" de un método dado al sitio de la llamada. Si se le da a elegir entre un método aplicable en una clase base o un nuevo método aplicable en una clase derivada, C# toma el de la clase derivada porque está más cerca, incluso si el de la clase base es mejor en todos los demás aspectos. coincidir.

Y así repasamos la lista. Las clases derivadas están más cerca que las clases base. Las clases internas están más cerca que las clases externas. Los métodos en la jerarquía de clases están más cerca que los métodos de extensión.

Y ahora llegamos a tu pregunta. La cercanía de un método de extensión depende de (1) ¿cuántos espacios de nombres "fuera" tuvimos que ir? y (2) ¿encontramos el método de extensión a través de using ¿o estaba allí mismo en el espacio de nombres? Por lo tanto, puede influir en la resolución de la sobrecarga cambiando en qué espacio de nombres static aparece la clase de extensión, para colocarla en un espacio de nombres más cercano al sitio de la llamada. O bien, puede cambiar su using declaraciones, para poner la using del espacio de nombres que contiene el deseado static clase más cerca que la otra.

Por ejemplo, si tienes

namespace FrobCo.Blorble

  using BazCo.TheirExtensionNamespace;
  using FrobCo.MyExtensionNamespace;
  ... some extension method call

entonces es ambiguo cuál está más cerca. Si desea priorizar el suyo sobre el de ellos, puede optar por hacer esto:

namespace FrobCo
{
  using BazCo.TheirExtensionNamespace;
  namespace Blorble
  
    using FrobCo.MyExtensionNamespace;
    ... some extension method call
  

Y ahora, cuando la resolución de sobrecarga va a resolver la llamada al método de extensión, las clases en Blorple ir primero, luego clases en FrobCo.MyExtensionNamespace, luego clases en FrobCo, y luego clases en BazCo.TheirExtensionNamespace.

¿Está claro?

Los métodos de extensión no se pueden anular ya que no son métodos de instancia y no son virtuales.

El compilador se quejará si importa ambas clases de métodos de extensión a través del espacio de nombres, ya que no sabrá a qué método llamar:

La llamada es ambigua entre los siguientes métodos o propiedades: ...

La única forma de evitar esto es llamar a su método de extensión usando normal static sintaxis del método. Así que en lugar de esto:

a.Foo();

tendrías que hacer esto:

YourExtensionMethodClass.Foo(a);

Basado en la premisa de Eric (y el hecho de que el código de vistas se representa en el espacio de nombres ASP), debería poder anularlo así (al menos funciona para mí en ASP.NET MVC4.0 Razor

using System.Web.Mvc;

namespace ASP 
  public static class InputExtensionsOverride 
    public static MvcHtmlString TextBox(this HtmlHelper htmlHelper, string name) 
      TagBuilder tagBuilder = new TagBuilder("input");
      tagBuilder.Attributes.Add("type", "text");
      tagBuilder.Attributes.Add("name", name);
      tagBuilder.Attributes.Add("crazy-override", "true");
      return new MvcHtmlString(tagBuilder.ToString(TagRenderMode.Normal));
    
  

Tenga en cuenta que el espacio de nombres debe ser "ASP".

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *