2011-02-05 11 views
69

Pozdrawiam wszystkich ... potrzebuję Trim a String. Ale chcę usunąć wszystkie powtarzające się puste spacje w samym ciągu, nie tylko na końcu, ani na początku. Mogłem zrobić to z metody jak:Jak rozszerzyć wbudowane typy C#, takie jak ciąg?

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

Jakie mam z here. Ale chcę, aby ten fragment kodu był wywoływany wewnątrz samego String.Trim(), więc myślę, że muszę rozszerzyć lub przeciążyć lub zastąpić metodę Trim ... Czy istnieje sposób, aby to zrobić?

Z góry dziękuję.

Odpowiedz

118

Ponieważ nie można rozszerzyć string.Trim(). Można utworzyć metodę rozszerzania opisaną jako here, która przycina i redukuje spacje.

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żna go używać jak tak

using CustomExtensions; 

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

Daje

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

Czy plik wymaga specjalnej nazwy? Lub gdzie to zapisać? Czy można go umieścić w klasie Util, czy coś w tym stylu? – testing

+1

@ testowanie Możesz umieścić je w dowolnym miejscu, o ile są one powiązane z projektem. Jeśli umieścisz je w określonej przestrzeni nazw, po prostu przynieś je za pomocą instrukcji "using", tak jak każdej innej klasy. – Twicetimes

+0

dlaczego nie zwróciłeś wyrażenia regularnego bezpośrednio z funkcji TrimAndReduce? znacznie ułatwiłoby to twoją odpowiedź.Chyba że użyjesz odpowiedzi tak bardzo, że musisz zadzwonić do niej gdzie indziej LOL – quemeful

20

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

Klasa System.String jest zamknięta, więc nie można korzystać z nadpisywania 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(); 
+5

Aby było jasne, nie, nie można modyfikować akcji, które wykonuje 'String.Trim'. –

7

Extension methods!

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

Jest tak a nie do Twojego pytania.

Tak, można rozszerzyć istniejące typy, korzystając z metod rozszerzeń. Oczywiście metody rozszerzeń mogą tylko uzyskać dostęp do publicznego interfejsu typu.

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

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

Nie, nie można wywołać tej metody Trim(). Metody rozszerzeń nie biorą udziału w przeciążeniu. Myślę, że kompilator powinien dać ci komunikat o błędzie z wyszczególnieniem tego.

Metody rozszerzeń są widoczne tylko wtedy, gdy używana jest przestrzeń nazw zawierająca typ definiujący metodę.

2

Poza tym przy użyciu metody rozszerzenie - prawdopodobnie dobrym kandydatem tutaj - jest to również możliwe, aby "wrap" obiekt (np. "kompozycja obiektu"). Tak długo, jak zawijany formularz nie zawiera więcej informacji niż opakowana rzecz, owinięty przedmiot może być łatwo przekazany poprzez niejawne lub jawne konwersje bez utraty informacji: po prostu zmiana typu/interfejsu.

Szczęśliwe kodowanie.

Powiązane problemy