Jak rozszerzyć typy wbudowane C #, takie jak String?

91

Pozdrowienia wszyscy ... Muszę . Ale chcę usunąć wszystkie powtarzające się spacje w samym ciągu, nie tylko na końcu lub na początku. Mógłbym to zrobić metodą:TrimString

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

Które mam stąd . Ale chcę, aby ten fragment kodu był wywoływany w samym String.Trim()sobie, więc myślę, że muszę rozszerzyć, przeciążyć lub zastąpić Trimmetodę ... Czy istnieje sposób, aby to zrobić?

Z góry dziękuję.

Girardi
źródło

Odpowiedzi:

166

Ponieważ nie możesz przedłużyć string.Trim(). Możesz utworzyć metodę rozszerzenia, jak opisano tutaj, która przycina i redukuje białe znaki.

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

Możesz go tak używać

using CustomExtensions;

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

Daje Ci

text = "I'm wearing the cheese. It isn't wearing me!";
JoeyRobichaud
źródło
Czy plik wymaga specjalnej nazwy? Albo gdzie to zapisujesz? Czy można go umieścić w klasie Util lub coś w tym stylu?
testowanie
1
@testing Możesz je umieścić w dowolnym miejscu, o ile są przywoływane w Twoim projekcie. Jeśli umieścisz je w określonej przestrzeni nazw, po prostu wprowadź je za pomocą instrukcji „using”, jak każda inna klasa.
Dwukrotnie
dlaczego nie zwróciłeś wyrażenia regularnego bezpośrednio z funkcji TrimAndReduce? znacznie ułatwiłoby to odczytanie odpowiedzi. Chyba że używasz odpowiedzi tak często, że musisz zadzwonić gdzie indziej LOL
quemeful
24

Czy to możliwe? Tak, ale tylko z metodą rozszerzenia

Klasa System.Stringjest zapieczętowana, więc nie można używać zastępowania ani dziedziczenia.

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
źródło
5
Aby było jasne, nie, nie można modyfikować podejmowanych działań String.Trim.
Michael Petrotta,
10

Twoje pytanie brzmi tak i nie.

Tak, możesz rozszerzyć istniejące typy przy użyciu metod rozszerzających. Metody rozszerzające mogą oczywiście uzyskiwać dostęp tylko do publicznego interfejsu tego typu.

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

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

Nie, nie możesz wywołać tej metody Trim(). Metody rozszerzające nie uczestniczą w przeciążaniu. Myślę, że kompilator powinien nawet wyświetlić komunikat o błędzie zawierający szczegółowe informacje.

Metody rozszerzające są widoczne tylko wtedy, gdy używana jest przestrzeń nazw zawierająca typ, który definiuje metodę.

Arne
źródło
7

Metody rozszerzające!

public static class MyExtensions
{
    public static string ConvertWhitespacesToSingleSpaces(this string value)
    {
        return Regex.Replace(value, @"\s+", " ");
    }
}
Corey Sunwold
źródło
2

Oprócz stosowania metod rozszerzających - prawdopodobnie jest to dobry kandydat - możliwe jest również „zawijanie” obiektu (np. „Skład obiektu”). Tak długo, jak opakowany formularz zawiera nie więcej informacji niż opakowywany przedmiot, opakowany element może zostać przejęty przez niejawne lub jawne konwersje bez utraty informacji: po prostu zmiana typu / interfejsu.

Miłego kodowania.


źródło