Как расширить встроенные типы С#, например String?

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

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

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

Спасибо заранее.

Ответ 1

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

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

Ответ 2

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

Класс 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();

Ответ 3

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

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

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

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

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

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

Ответ 4

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

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

Ответ 5

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

Счастливое кодирование.