2011-02-05 15 views
69

Saluti a tutti ... Ho bisogno di Trim a String. Ma voglio rimuovere tutti gli spazi vuoti ripetuti all'interno della String stessa, non solo alla fine o all'inizio di essa. Potrei farlo con un metodo come:Come estendere i tipi di C# built-in, come String?

public static string ConvertWhitespacesToSingleSpaces(string value) 
{ 
    value = Regex.Replace(value, @"\s+", " "); 
} 

che ho ricevuto da here. Ma voglio che questo pezzo di codice venga chiamato all'interno dello stesso String.Trim(), quindi penso di dover estendere o sovraccaricare o sovrascrivere il metodo ... C'è un modo per farlo?

Grazie in anticipo.

risposta

118

Poiché non è possibile estendere string.Trim(). È possibile creare un metodo di estensione come descritto in here che riduce e riduce gli spazi bianchi.

namespace CustomExtensions 
{ 
    //Extension methods must be defined in a static class 
    public static class StringExtension 
    { 
     // This is the extension method. 
     // The first parameter takes the "this" modifier 
     // and specifies the type for which the method is defined. 
     public static string TrimAndReduce(this string str) 
     { 
      return ConvertWhitespacesToSingleSpaces(str).Trim(); 
     } 

     public static string ConvertWhitespacesToSingleSpaces(this string value) 
     { 
      return Regex.Replace(value, @"\s+", " "); 
     } 
    } 
} 

Si può usare in questo modo

using CustomExtensions; 

string text = " I'm wearing the cheese. It isn't wearing me! "; 
text = text.TrimAndReduce(); 

Ti dà

text = "I'm wearing the cheese. It isn't wearing me!"; 
+0

Il file ha bisogno di un nome speciale? O dove lo salvi? Può essere inserito in una classe Util o qualcosa del genere? – testing

+1

@testing Puoi metterli ovunque purché siano referenziati nel tuo progetto. Se li metti in uno spazio dei nomi specifico, inseriscili con un'istruzione 'using' come qualsiasi altra classe. – Twicetimes

+0

perché non hai restituito la regex direttamente dalla funzione TrimAndReduce? avrebbe reso la tua risposta molto più semplice da leggere.A meno che tu non usi la tua risposta così tanto che devi chiamarla altrove LOL – quemeful

20

È possibile? Sì, ma solo con un metodo di estensione

La classe System.String è sigillata, quindi non è possibile utilizzare l'override o l'ereditarietà.

public static class MyStringExtensions 
{ 
    public static string ConvertWhitespacesToSingleSpaces(this string value) 
    { 
    return Regex.Replace(value, @"\s+", " "); 
    } 
} 

// usage: 
string s = "test !"; 
s = s.ConvertWhitespacesToSingleSpaces(); 
+5

Per essere chiari, no, non è possibile modificare le azioni eseguite da 'String.Trim'. –

7

Extension methods!

public static class MyExtensions 
{ 
    public static string ConvertWhitespacesToSingleSpaces(this string value) 
    { 
     return Regex.Replace(value, @"\s+", " "); 
    } 
} 
9

C'è un sì e un no alla tua domanda.

Sì, è possibile estendere i tipi esistenti utilizzando i metodi di estensione. I metodi di estensione, naturalmente, possono accedere solo all'interfaccia pubblica del tipo.

public static string ConvertWhitespacesToSingleSpaces(this string value) {...} 

// some time later... 
"hello world".ConvertWhitespacesToSingleSpaces() 

No, non è possibile chiamare questo metodo Trim(). I metodi di estensione non partecipano al sovraccarico. Penso che un compilatore dovrebbe anche darti un messaggio di errore che dettagli questo.

I metodi di estensione sono visibili solo se viene utilizzato lo spazio dei nomi contenente il tipo che definisce il metodo.

2

Oltre a utilizzare metodi di estensione - probabilmente un buon candidato qui - è anche possibile "avvolgere" un oggetto (ad es. "composizione dell'oggetto"). Finché il modulo avvolto non contiene più informazioni della cosa che viene incartata, l'oggetto avvolto può essere passato in modo pulito attraverso conversioni implicite o esplicite senza perdita di informazioni: solo un cambio di tipo/interfaccia.

Felice codifica.

Problemi correlati