Pregunta

¿Cómo es posible crear métodos prototipo en C#.Net?

En JavaScript, puedo hacer lo siguiente para crear un método de recorte para el objeto de cadena:

String.prototype.trim = function() {
    return this.replace(/^\s+|\s+$/g,"");
}

¿Cómo puedo hacer esto en C#.Net?

¿Fue útil?

Solución

No puede agregar métodos dinámicamente a objetos o clases existentes en .NET, excepto cambiando la fuente de esa clase.

Sin embargo, en C# 3.0 puede utilizar métodos de extensión, que mirar como métodos nuevos, pero son mágicos en tiempo de compilación.

Para hacer esto con su código:

public static class StringExtensions
{
    public static String trim(this String s)
    {
        return s.Trim();
    }
}

Para usarlo:

String s = "  Test  ";
s = s.trim();

Esto parece un método nuevo, pero se compilará exactamente de la misma manera que este código:

String s = "  Test  ";
s = StringExtensions.trim(s);

¿Qué estás tratando de lograr exactamente?¿Quizás haya mejores formas de hacer lo que quieres?

Otros consejos

Parece que estás hablando de los métodos de extensión de C#.Agrega funcionalidad a las clases existentes insertando la palabra clave "this" antes del primer parámetro.El método tiene que ser un método estático en una clase estática.Las cadenas en .NET ya tienen un método "Recortar", así que usaré otro ejemplo.

public static class MyStringEtensions
{
    public static bool ContainsMabster(this string s)
    {
        return s.Contains("Mabster");
    }
}

Así que ahora cada cadena tiene un método ContieneMabster tremendamente útil, que puedo usar así:

if ("Why hello there, Mabster!".ContainsMabster()) { /* ... */ }

Tenga en cuenta que también puede agregar métodos de extensión a las interfaces (por ejemplo, IList), lo que significa que cualquier clase que implemente esa interfaz también adoptará ese nuevo método.

Cualquier parámetro adicional que declare en el método de extensión (después del primer parámetro "este") se trata como parámetros normales.

Debe crear un método de extensión, que requiere .NET 3.5.El método debe ser estático, en una clase estática.El primer parámetro del método debe tener el prefijo "this" en la firma.

public static string MyMethod(this string input)
{
    // do things
}

Luego puedes llamarlo como

"asdfas".MyMethod();

Usando el compilador 3.5 puedes usar un método de extensión:

public static void Trim(this string s)
{
  // implementation
}

Puedes usar esto en un proyecto dirigido a CLR 2.0 (compilador 3.5) incluyendo este truco:

namespace System.Runtime.CompilerServices
{
  [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class | AttributeTargets.Assembly)]
  public sealed class ExtensionAttribute : Attribute
  {
  }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top