Come estendere i tipi predefiniti di C #, come String?


89

Saluti a tutti ... ho bisogno di Trimun String. Ma voglio rimuovere tutti gli spazi vuoti ripetuti all'interno della stringa stessa, non solo alla fine o all'inizio di essa. Potrei farlo con un metodo come:

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

Che ho preso da qui . Ma voglio che questo pezzo di codice venga chiamato all'interno dello String.Trim()stesso, quindi penso di aver bisogno di estendere o sovraccaricare o sovrascrivere il Trimmetodo ... C'è un modo per farlo?

Grazie in anticipo.

Risposte:


164

Dal momento che non puoi estendere string.Trim(). È possibile creare un metodo di estensione come descritto qui che ritaglia 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+", " ");
        }
    }
}

Puoi usarlo così

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!";

Il file necessita di un nome speciale? O dove lo salvi? Può essere inserito in una classe Util o qualcosa del genere?
test il

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

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 da
doverla

23

È 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 che vengono String.Trimeseguite.
Michael Petrotta

10

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

Sì, puoi estendere i tipi esistenti utilizzando 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 puoi chiamare questo metodo Trim(). I metodi di estensione non partecipano al sovraccarico. Penso che un compilatore dovrebbe persino darti un messaggio di errore che lo dettaglia.

I metodi di estensione sono visibili solo se lo spazio dei nomi contenente il tipo che definisce il metodo utilizza'ed.


7

Metodi di estensione!

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

2

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

Buona codifica.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.