¿Cómo extender los tipos integrados de C #, como String?


89

Saludos a todos ... necesito Trimuna String. Pero quiero eliminar todos los espacios en blanco repetidos dentro de la Cadena en sí, no solo al final o al comienzo. Podría hacerlo con un método como:

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

Que obtuve de aquí . Pero quiero que se llame a este fragmento de código dentro de String.Trim()sí mismo, así que creo que necesito extender, sobrecargar o anular el Trimmétodo ... ¿Hay alguna manera de hacerlo?

Gracias por adelantado.

Respuestas:


164

Dado que no se puede extender string.Trim(). Puede crear un método de extensión como se describe aquí que recorta y reduce los espacios en blanco.

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

Puedes usarlo así

using CustomExtensions;

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

Te dio

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

¿El archivo necesita un nombre especial? ¿O dónde guardas esto? ¿Se puede poner en una clase de Util o algo así?
prueba el

1
@testing Puede colocarlos en cualquier lugar siempre que estén referenciados en su proyecto. Si los coloca en un espacio de nombres específico, simplemente introdúzcalos con una declaración 'using' como cualquier otra clase.
Dos veces

¿Por qué no devolvió la expresión regular directamente desde la función TrimAndReduce? hubiera hecho su respuesta mucho más sencilla de leer. A menos que use su respuesta tanto que necesite llamar a eso en otro lugar LOL
quemeful

23

¿Es posible? Sí, pero solo con un método de extensión

La clase System.Stringestá sellada, por lo que no puede usar la invalidación o la herencia.

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

// usage: 
string s = "test   !";
s = s.ConvertWhitespacesToSingleSpaces();

5
Para ser claros, no, no es posible modificar las acciones que se String.Trimrealizan.
Michael Petrotta

10

Hay un sí y un no a tu pregunta.

Sí, puede ampliar los tipos existentes utilizando métodos de extensión. Los métodos de extensión, naturalmente, solo pueden acceder a la interfaz pública del tipo.

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

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

No, no puede llamar a este método Trim(). Los métodos de extensión no participan en la sobrecarga. Creo que un compilador debería incluso darte un mensaje de error detallando esto.

Los métodos de extensión solo son visibles si el espacio de nombres que contiene el tipo que define el método está using'ed.



2

Además de utilizar métodos de extensión, probablemente un buen candidato aquí, también es posible "envolver" un objeto (por ejemplo, "composición de objeto"). Siempre que el formulario empaquetado no contenga más información que la cosa que se está empaquetando, el elemento empaquetado puede pasar limpiamente a través de conversiones implícitas o explícitas sin pérdida de información: solo un cambio de tipo / interfaz.

Codificación feliz.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.