Як розширити вбудовані типи C #, наприклад String?


89

Привіт всім ... Мені потрібно . Але я хочу видалити всі повторювані порожні пробіли в самому рядку, не тільки в кінці або на початку його. Я міг би зробити це за допомогою такого методу, як:TrimString

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

Яке я отримав звідси . Але я хочу, щоб цей шматок коду викликався в самому String.Trim()собі, тому я думаю, що мені потрібно розширити або перевантажити або замінити Trimметод ... Чи є спосіб це зробити?

Заздалегідь спасибі.

Відповіді:


163

Оскільки ви не можете продовжити 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!";

Чи потрібно файлу спеціальне ім'я? Або де ви це зберігаєте? Чи можна додати його до класу Util чи щось подібне?
тестування

1
@testing Ви можете розмістити їх куди завгодно, якщо вони вказані у вашому проекті. Якщо ви розміщуєте їх у певному просторі імен, просто додайте їх із використанням оператора 'using', як будь-який інший клас.
Двічі

чому ви не повернули регулярний вираз прямо з функції TrimAndReduce? це зробило б вашу відповідь набагато простішою для читання. Якщо ти не використовуєш свою відповідь настільки, що тобі потрібно зателефонувати в іншому місці LOL
кемел

23

Це можливо? Так, але тільки з методом розширення

Клас 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вживаються.
Michael Petrotta

10

На ваше запитання є так і ні.

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

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

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

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

Методи розширення видно лише в тому випадку, якщо використовується простір імен, що містить тип, що визначає метод.



2

Окрім використання методів розширення - мабуть, тут є хорошим кандидатом - також можна "обернути" об'єкт (наприклад, "композиція об'єкта"). Поки обгорнута форма не містить більше інформації, ніж річ, яка обгортається, обгорнутий елемент може бути чисто переданий через неявні або явні перетворення без втрати інформації: просто зміна типу / інтерфейсу.

Щасливого кодування.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.