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

91

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

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

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

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

Жирарди
источник

Ответы:

166

Поскольку вы не можете продлить 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!";
JoeyRobichaud
источник
Нужно ли файлу особое имя? Или где это сохранить? Можно ли его поместить в класс Util или что-то в этом роде?
тестирование
1
@testing Вы можете разместить их где угодно, если на них есть ссылка в вашем проекте. Если вы поместите их в определенное пространство имен, просто внесите их с помощью оператора using, как и любой другой класс.
Дважды
почему вы не вернули регулярное выражение прямо из функции TrimAndReduce? это упростило бы чтение вашего ответа. Если только вы не используете свой ответ так часто, что вам нужно позвонить в другое место LOL
quemeful
24

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

Класс 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();
Хенк Холтерман
источник
5
Чтобы было ясно, нет, невозможно изменить предпринимаемые действия String.Trim.
Майкл Петротта
10

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

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

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

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

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

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

Арне
источник
2

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

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


источник