2009-05-15 31 views
131

Eventuali duplicati:
Can I add extension methods to an existing static class?metodi di estensione statici

C'è un modo per aggiungere un metodo di estensione statica ad una classe.

in particolare voglio sovraccaricare Boolean.Parse per consentire un argomento int.

+7

come può essere un duplicato? Questo vuole aggiungere un metodo di estensione che si comporta come un metodo statico (classe) a una classe che può avere istanze come Boolean, mentre l'altra domanda chiede come aggiungere un metodo di estensione a una classe statica –

+1

sarebbe bello se la sintassi C# supportata come: "DependencyProperty statico pubblico Registro (static DependencyProperty x, string name, Type propertyType, Type ownerType, FrameworkPropertyMetadata typeMetadata)", in modo che potrei usarlo in Silverlight per ottenere la compatibilità con la sintassi WPF (per avvolgere l'implementazione di valore di Dr.WPF della coercizione del valore per DependencyProperty). Nota il parametro "static DependencyProperty" invece di "this DependencyProperty" (in alternativa anziché statico, magari potrebbero usare altre parole chiave come type o typeof) –

+0

Lo stesso problema con 'Enum.Parse' con la fornitura di una stringa. Estendere una stringa sfortunatamente non è così ovvio quanto estendere un int è. C# manca sintassi! – C4u

risposta

125

In breve, no, non puoi.

Risposta lunga, i metodi di estensione sono solo zucchero sintattico. IE:

se si dispone di un metodo di estensione su stringa diciamo:

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

Quando poi si chiami:

myString.SomeStringExtension(); 

il compilatore appena lo trasforma in:

ExtensionClass.SomeStringExtension(myString); 

Come potete vedere, non c'è modo di farlo per i metodi statici.

E un'altra cosa mi è venuta in mente: quale sarebbe davvero il punto di poter aggiungere metodi statici su classi esistenti? Si può solo avere il proprio classe di supporto che fa la stessa cosa, così ciò che è veramente il benfit di essere in grado di fare:

Bool.Parse(..) 

vs.

Helper.ParseBool(..); 

in realtà non portare molto al tavolo ...

+136

* quale sarebbe davvero il punto di essere in grado di aggiungere metodi statici su classi esistenti? * Ho voluto farlo ripetutamente in molti casi. Il mio ragionamento è: voglio estendere 'String.Reconvert' come metodo di estensione. Potrei scrivere 'Helper.ReconvertString', ma usando Visual Studio e il completamento automatico, i miei colleghi non guarderebbero in' Helper'. Cercerebbero un metodo 'String', e non trovarne uno, probabilmente andranno a reinventare la ruota. – abelenky

+79

Non sono affatto d'accordo, il vantaggio sarebbe lo stesso beneficio fornito dai metodi di estensione istanziati. Potrei anche utilizzare le classi di supporto per lo stesso scopo dei normali metodi di estensione, ma perché dovrei farlo quando l'approccio di estensione è molto più elegante con cui lavorare. Lo zucchero sintattico è utile, sia esso istanziato o statico. – WiredWiz

+31

Penso che porterebbero tanto in tavola quanto lo zucchero sintattico. Riguarda l'accessibilità e le cose sono dove ci si aspetta che siano nelle classi popolari, piuttosto che in oscuri aiutanti. Ad esempio, sarebbe utile un metodo di estensione come DateTime.FromNanoseconds o DateTime.FromSecondsSinceEpoch. Questi non hanno senso come metodo di istanza, dal momento che sono essenzialmente costruttori, eppure sarebbero facili da trovare come metodi di estensione statici. Il motivo è che le classi del framework sono semplicemente incomplete ei metodi di estensione sono una soluzione per completarli. – Triynko

-7

No, ma si potrebbe avere qualcosa di simile:

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

in particolare voglio sovraccaricare Boolean.Parse per consentire un argomento int.

Sarebbe un'estensione per lavoro int?

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

Poi si può chiamare in questo modo:

int x = 1; 

bool y=x.ToBoolean(); 
+11

+1 per la creatività. Non hai risposto alla sua domanda, ma credo che tu abbia trovato la soluzione più elegante. Soprattutto considerando che letteralmente "analizzare" significa analizzare una _string_ :) (vedi [definizione] (http://en.wikipedia.org/wiki/Parsing)) – tsemer

+1

Non dimenticare, int è un valore Type. È necessario usarlo come @bsneeze 'y = x.ToBoolean()' ha scritto, perché nei metodi di estensione per i Tipi di valore, i valori sono ** NON ** passati per riferimento. – LuckyLikey

-2

si potrebbe aggiungere un metodo di estensione 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; 
    } 
} 

usato come questo

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

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

Questo non risponde alla domanda. Questo dimostra solo un normale metodo di estensione che viene invocato su un'istanza di 'int', in questo caso 0, 1, 2 o 3. Un letterale' int' è tanto un'istanza che una variabile. – ProfK

+2

Inoltre, non farlo. Mai. '1.Parse()' è privo di significato come '" My String "÷ 6'. Il tuo codice dovrebbe essere chiaro e comprensibile da altri. "Parse" è "analizzare una stringa" come @tsemer menzionato sopra. –