2010-11-19 23 views
5

Me pregunto si puedo usar el método de extensión u otras técnicas para extender la clase estática como System.Net.Mime.MediaTypeNames.Image, tiene menos tipo de lo que necesito.método de extensión para extender la clase estática

+0

No puede extender clases estáticas; busca SO para los duplicados de esta pregunta y verás algunas soluciones. – BeemerGuy

+0

¿Por qué necesitarías eso alguna vez? La clase estática no tiene contexto, y lo que sea que pueda dentro de una clase estática podría hacerse en "cualquier otro lugar" en el código. –

+0

@Amby - Creo que es posible que desee hacerlo únicamente para propósitos organizativos. Claro que puedes crear una clase estática de ImageUtility con los métodos necesarios (que, de acuerdo con esta respuesta, tendrá que hacer de todos modos), pero creo que al OP le gustaría organizar su código de una manera que no necesite la clase adicional . Desafortunadamente, no puedes. (Vine aquí buscando hacer lo mismo). – MattW

Respuesta

6

No, los métodos de extensión solo se pueden usar para agregar métodos de instancia, no métodos estáticos (o incluso propiedades). Los métodos de extensión son realmente solo azúcar sintáctico alrededor de métodos estáticos. Por ejemplo, cuando se utiliza un método de extensión como Count():

var list = GetList(); 
var size = list.Count(); 

Esto es en realidad compilado para:

var list = GetList(); 
var size = Enumerable.Count(list); 

No se puede agregar métodos estáticos adicionales para una clase existente utilizando métodos de extensión .

+0

¿Es correcto decir que "los métodos de extensión solo se pueden usar para agregar métodos de instancia"? Como explicas, solo dan la apariencia de ser métodos de instancia. En realidad, no son métodos de instancia, o podría acceder a miembros no públicos de la clase. –

0

No, esto aún no es posible en C#, aunque con suerte lo será en algún momento. Y no puede subclasificar una clase estática y agregar nuevos métodos de esa manera, ya que las clases estáticas deben derivar de object. Sin embargo, una cosa que puedes hacer, que produce un efecto bastante similar en tu código, es simplemente declarar otra clase estática que utilizarás cuando quieras tus métodos de extensión. Por ejemplo:

public static class MessageBox2 
{ 
    public static DialogResult ShowError(string Caption, string Message, params object[] OptionalFormatArgs) 
    { 
     return MessageBox.Show(string.Format(Message, OptionalFormatArgs), Caption, MessageBoxButtons.OK, MessageBoxIcon.Error); 
    } 
} 

Desde la clase original es estático, por definición, el método de la "extensión" no necesita recibir una instancia como un parámetro this, y simplemente se pueden utilizar métodos estáticos de la clase original.

Cuestiones relacionadas