Как расширить встроенные типы C #, например String? - PullRequest
78 голосов
/ 06 февраля 2011

Приветствую всех ... Мне нужно Trim a String.Но я хочу удалить все повторяющиеся пробелы внутри самой строки, не только в конце или в начале.Я мог бы сделать это с помощью метода:

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

, который я получил от здесь .Но я хочу, чтобы этот фрагмент кода вызывался внутри самого String.Trim(), поэтому я думаю, что мне нужно расширить или перегрузить или переопределить метод Trim ... Есть ли способ сделать это?

Заранее спасибо.

Ответы [ 5 ]

145 голосов
/ 06 февраля 2011

Так как вы не можете расширять string.Trim (). Вы можете создать метод Extension, как описано здесь , который урезает и уменьшает пробелы.

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

Вы можете использовать его так, как

using CustomExtensions;

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

Дает вам

text = "I'm wearing the cheese. It isn't wearing me!";
21 голосов
/ 06 февраля 2011

Возможно ли это? Да, но только с методом расширения

Класс System.String запечатан, поэтому вы не можете использовать переопределение или наследование.

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

// usage: 
string s = "test   !";
s = s.ConvertWhitespacesToSingleSpaces();
10 голосов
/ 06 февраля 2011

В вашем вопросе есть да и нет.

Да, вы можете расширять существующие типы, используя методы расширения. Методы расширения, естественно, могут получить доступ только к общедоступному интерфейсу типа.

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

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

Нет, вы не можете вызвать этот метод Trim (). Методы расширения не участвуют в перегрузке. Я думаю, что компилятор должен даже дать вам сообщение об ошибке, детализирующее это.

Методы расширения доступны только в том случае, если пространство имен, содержащее тип, определяющий метод, использует ʻed.

7 голосов
/ 06 февраля 2011

Методы расширения!

public static class MyExtensions
{
    public static string ConvertWhitespacesToSingleSpaces(this string value)
    {
        return Regex.Replace(value, @"\s+", " ");
    }
}
2 голосов
/ 06 февраля 2011

Помимо использования методов расширения - вероятно, хороший кандидат здесь - также можно «обернуть» объект (например, «состав объекта»). До тех пор, пока упакованная форма содержит не больше информации, чем упаковываемая вещь, упакованный элемент может быть чисто пропущен через неявные или явные преобразования без потери информации: просто изменение типа / интерфейса.

Удачного кодирования.

...