Wie kann man integrierte C # -Typen wie String erweitern?

89

Grüße an alle ... Ich muss Trima String. Aber ich möchte alle wiederholten Leerzeichen innerhalb des Strings selbst entfernen, nicht nur am Ende oder am Anfang. Ich könnte es mit einer Methode machen wie:

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

Was ich von hier bekommen habe . Aber ich möchte, dass dieser Code in sich selbst aufgerufen wird String.Trim(), also denke ich, dass ich die TrimMethode erweitern oder überladen oder überschreiben muss ... Gibt es eine Möglichkeit, dies zu tun?

Danke im Voraus.

Girardi
quelle

Antworten:

163

Da kann man nicht verlängern string.Trim(). Sie können eine hier beschriebene Erweiterungsmethode erstellen, mit der Leerzeichen gekürzt und reduziert werden.

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+", " ");
        }
    }
}

Sie können es so verwenden

using CustomExtensions;

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

Gibt Ihnen

text = "I'm wearing the cheese. It isn't wearing me!";
JoeyRobichaud
quelle
Benötigt die Datei einen speziellen Namen? Oder wo speichern Sie das? Kann es in eine Util-Klasse oder so etwas geputtet werden?
Testen
1
@testing Sie können sie an einer beliebigen Stelle platzieren, solange auf sie in Ihrem Projekt verwiesen wird. Wenn Sie sie in einen bestimmten Namespace einfügen, bringen Sie sie wie jede andere Klasse mit einer 'using'-Anweisung ein.
Zweimal
Warum haben Sie den regulären Ausdruck nicht direkt von der TrimAndReduce-Funktion zurückgegeben? es hätte Ihre Antwort viel einfacher zu lesen gemacht. Es sei denn, Sie verwenden Ihre Antwort so oft, dass Sie das anderswo LOL nennen müssen
quemeful
23

Ist es möglich? Ja, aber nur mit einer Erweiterungsmethode

Die Klasse System.Stringist versiegelt, sodass Sie weder Überschreiben noch Vererbung verwenden können.

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

// usage: 
string s = "test   !";
s = s.ConvertWhitespacesToSingleSpaces();
Henk Holterman
quelle
5
Um klar zu sein, nein, es ist nicht möglich, die durchgeführten Aktionen zu ändern String.Trim.
Michael Petrotta
10

Ihre Frage hat ein Ja und ein Nein.

Ja, Sie können vorhandene Typen mithilfe von Erweiterungsmethoden erweitern. Erweiterungsmethoden können natürlich nur auf die öffentliche Schnittstelle des Typs zugreifen.

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

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

Nein, Sie können diese Methode nicht aufrufen Trim(). Erweiterungsmethoden sind nicht an der Überladung beteiligt. Ich denke, ein Compiler sollte Ihnen sogar eine Fehlermeldung geben, die dies detailliert beschreibt.

Erweiterungsmethoden sind nur sichtbar, wenn der Namespace verwendet wird, der den Typ enthält, der die Methode definiert.

Arne
quelle
7

Erweiterungsmethoden!

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

Neben der Verwendung von Erweiterungsmethoden - hier wahrscheinlich ein guter Kandidat - ist es auch möglich, ein Objekt zu "verpacken" (z. B. "Objektzusammensetzung"). Solange das verpackte Formular nicht mehr Informationen enthält als das verpackte Objekt, kann das verpackte Element ohne Informationsverlust sauber durch implizite oder explizite Konvertierungen geleitet werden: nur eine Änderung des Typs / der Schnittstelle.

Viel Spaß beim Codieren.


quelle