2008-08-07 9 views

Respuesta

20

No se puede agregar dinámicamente métodos de objetos o clases existentes en .NET, excepto por el cambio de la fuente de esa clase.

Puede, sin embargo, en C# 3.0, usar métodos de extensión, que parecen como métodos nuevos, pero son mágicos en tiempo de compilación.

para hacer esto por su código:

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

utilizarlo:

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

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

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

¿Qué es exactamente lo que estás tratando de lograr? Tal vez hay mejores formas de hacer lo que quieres?

+0

Gracias Lassevk, gran respuesta :) En respuesta a "¿Qué estás tratando de lograr exactamente?". De vez en cuando, tengo la necesidad de manipular una cuerda u otro objeto. En lugar de tener que llamar a una función para hacer esto, hubiera pensado que era mejor llamarlo como un método. Actualmente estoy escribiendo aplicaciones web en Asp.net y todavía no creo que Asp.net 3.x, así que tendré que esperar por ahora. Pero gracias por tu respuesta. – GateKiller

0

Necesita 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 ir precedido de "this" en la firma.

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

entonces le puede llamar como

"asdfas".MyMethod(); 
0

Usando el compilador 3.5 se puede utilizar un método de extensión:

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

Puede utilizar esto en un proyecto CLR 2.0 apuntado (3,5 compilador) mediante la inclusión de este truco:

namespace System.Runtime.CompilerServices 
{ 
    [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class | AttributeTargets.Assembly)] 
    public sealed class ExtensionAttribute : Attribute 
    { 
    } 
} 
4

Suena como si estuvieras hablando de los métodos de extensión de C#. Agregue funcionalidad a 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 "Trim", 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 ContainsMabster tremendamente útil, que puedo usar como esto:

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

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

Los parámetros adicionales que declare en el método de extensión (después del primer parámetro "this") se tratan como parámetros normales.

Cuestiones relacionadas