2009-05-15 34 views
131

Duplicar posibles:
Can I add extension methods to an existing static class?métodos de extensión estáticas

¿Hay alguna manera de añadir un método de extensión estática a una clase.

específicamente Quiero sobrecargar Boolean.Parse para permitir un argumento int.

+7

cómo puede ser esto ¿un duplicado? Esto quiere agregar un método de extensión que se comporta como un método estático (clase) a una clase que puede tener instancias como Boolean, mientras que la otra pregunta cómo agregar un método de extensión a una clase estática –

+1

sería bueno si C# apoyara la sintaxis como: "Public DependencyProperty Register estático (DependencyProperty estático x, nombre de cadena, Tipo propertyType, Type ownerType, FrameworkPropertyMetadata typeMetadata)", para poder usarlo en Silverlight para lograr la compatibilidad con la sintaxis de WPF (para ajustar la implementación de coerción de valor de Dr.WPF) para DependencyProperty). Tenga en cuenta el parámetro "DependencyProperty estático" en lugar de "this DependencyProperty" (alternativamente en lugar de estático quizás podrían usar otras palabras clave como tipo o typeof) –

+0

Mismo problema con 'Enum.Parse' con la provisión de una cadena. Lamentablemente, la extensión de una cadena no es tan obvia como extender una int. C# falta sintaxis! – C4u

Respuesta

125

En resumen, no, no puedes.

Respuesta larga, los métodos de extensión son simplemente azúcar sintáctico. IE:

si tiene un método de extensión de cadena digamos:

public static string SomeStringExtension(this string s) 
{ 
    //whatever.. 
} 

Cuando a continuación, lo llama:

myString.SomeStringExtension(); 

el compilador justo lo convierte en:

ExtensionClass.SomeStringExtension(myString); 

Como puede ver, no hay forma de hacerlo para los métodos estáticos.

Y otra cosa acaba de darme cuenta: ¿cuál sería realmente el punto de poder agregar métodos estáticos en las clases existentes? Usted sólo puede tener su propia clase de ayuda que hace lo mismo, así que lo que es realmente la benfit en ser capaz de hacer:

Bool.Parse(..) 

vs

Helper.ParseBool(..); 

en realidad no trae mucho a la mesa ...

+136

* ¿Cuál sería realmente el punto de poder agregar métodos estáticos en las clases existentes? * He querido hacer esto repetidamente en muchos casos. Mi razonamiento es: quiero extender 'String.Reconvert' como un método de extensión. Podría escribir 'Helper.ReconvertString', pero al usar Visual Studio y autocompletar, mis compañeros de trabajo no buscarían en' Helper'. Buscarían un método de "cadena", y al no encontrar uno, probablemente irían a reinventar la rueda. – abelenky

+79

Estoy completamente en desacuerdo, el beneficio de esto sería el mismo beneficio que brindan los métodos de extensión instalados. También podría usar clases de ayuda para cumplir el mismo propósito que los métodos de extensión normales, pero ¿por qué debería hacerlo cuando el enfoque de la extensión es mucho más elegante para trabajar con él? El azúcar sintáctico es útil, ya sea instanciado o estático. – WiredWiz

+31

Creo que aportarán tanto como sea posible en cuanto a azúcar sintáctico. Se trata de accesibilidad y que las cosas estén donde usted espera que estén en las clases populares, en lugar de en ayudantes obscuros. Por ejemplo, un método de extensión como DateTime.FromNanoseconds sería útil, o DateTime.FromSecondsSinceEpoch. Estos no tienen sentido como método de instancia, ya que son esencialmente constructores, pero serían fáciles de encontrar como métodos de extensión estáticos. La razón es que las clases de marco son simplemente incompletas, y los métodos de extensión son una solución para completarlas. – Triynko

-7

No, pero usted podría tener algo como:

bool b; 
b = b.YourExtensionMethod(); 
65

específicamente Quiero sobrecargar Boolean.Parse para permitir un argumento int.

¿Tendría una extensión para int work?

public static bool ToBoolean(this int source){ 
    //do it 
    //return it 
} 

Entonces se le puede llamar así:

int x = 1; 

bool y=x.ToBoolean(); 
+11

+1 para la creatividad. No respondió su pregunta, pero creo que encontró la solución más elegante. Especialmente teniendo en cuenta que literalmente "analizar" significa analizar una cadena _ :) (ver [definición] (http://en.wikipedia.org/wiki/Parsing)) – tsemer

+1

No se olvide, int es un tipo de valor. Necesitará usarlo como @bsneeze 'y = x.ToBoolean()' ha escrito, porque en los Métodos de extensión para Tipos de valores, los valores ** NO ** pasan por referencia. – LuckyLikey

-2

Se podría añadir un método de extensión a int

public static class IntExtensions 
{ 
    public static bool Parse(this int value) 
    { 
     if (value == 0) 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 
    public static bool? Parse2(this int value) 
    { 
     if (value == 0) 
     { 
      return true; 
     } 
     if (value == 1) 
     { 
      return false; 
     } 
     return null; 
    } 
} 

utilizarse como esto

 bool bool1 = 0.Parse(); 
     bool bool2 = 1.Parse(); 

     bool? bool3 = 0.Parse2(); 
     bool? bool4 = 1.Parse2(); 
     bool? bool5 = 3.Parse2(); 
+4

Esto no responde la pregunta. Esto solo demuestra un método de extensión normal que se invoca en una instancia de 'int', en este caso 0, 1, 2 o 3. Un literal' int' es tanto una instancia como una variable. – ProfK

+2

Además, no hagas esto. Nunca. '1.Parse()' no tiene sentido como '" My String "÷ 6'. Su código debe ser claro y comprensible para los demás. Para "Parse" es "analizar una cadena" como @tsemer mencionado anteriormente. –

Cuestiones relacionadas