Como estender os tipos internos de C #, como String?

89

Saudações a todos ... Eu preciso Trimde um String. Mas eu quero remover todos os espaços em branco repetidos dentro da própria String, não apenas no final ou no início dela. Eu poderia fazer isso com um método como:

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

Que eu peguei daqui . Mas eu quero que esse pedaço de código seja chamado dentro do String.Trim()próprio, então acho que preciso estender ou sobrecarregar ou substituir o Trimmétodo ... Existe uma maneira de fazer isso?

Desde já, obrigado.

Girardi
fonte

Respostas:

163

Uma vez que você não pode estender string.Trim(). Você poderia fazer um método de extensão conforme descrito aqui, que apara e reduz os espaços em branco.

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

Você pode usar assim

using CustomExtensions;

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

Da-te

text = "I'm wearing the cheese. It isn't wearing me!";
JoeyRobichaud
fonte
O arquivo precisa de um nome especial? Ou onde você salva isso? Ele pode ser colocado em uma classe Util ou algo parecido?
teste em
1
@testing Você pode colocá-los em qualquer lugar, desde que sejam referenciados em seu projeto. Se você os colocar em um namespace específico, apenas traga-os com uma instrução 'using' como qualquer outra classe.
Duas vezes,
por que você não retornou o regex direto da função TrimAndReduce? isso teria tornado sua resposta muito mais simples de ler. A menos que você use tanto sua resposta que precise ligar para isso em outro lugar LOL
quemeful
23

É possível? Sim, mas apenas com um método de extensão

A classe System.Stringé lacrada, então você não pode usar substituição ou herança.

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

// usage: 
string s = "test   !";
s = s.ConvertWhitespacesToSingleSpaces();
Henk Holterman
fonte
5
Para ser claro, não, não é possível modificar as ações que String.Trimexecutam.
Michael Petrotta
10

Há um sim e um não em sua pergunta.

Sim, você pode estender os tipos existentes usando métodos de extensão. Os métodos de extensão, naturalmente, só podem acessar a interface pública do tipo.

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

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

Não, você não pode chamar este método Trim() . Os métodos de extensão não participam da sobrecarga. Acho que um compilador deve até mesmo fornecer uma mensagem de erro detalhando isso.

Os métodos de extensão só são visíveis se o namespace que contém o tipo que define o método estiver usando'ed.

Arne
fonte
7

Métodos de extensão!

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

Além de usar métodos de extensão - provavelmente um bom candidato aqui - também é possível "embrulhar" um objeto (por exemplo, "composição de objeto"). Desde que o formulário empacotado não contenha mais informações do que a coisa que está sendo empacotada, então o item empacotado pode ser passado de forma limpa por meio de conversões implícitas ou explícitas sem perda de informação: apenas uma mudança de tipo / interface.

Boa codificação.


fonte