2012-02-26 12 views
5

Quiero hacer un atributo que permitirá mí especificar algún método aplicado a la propiedad, así:Cómo hacer referencia a un método en el parámetro atributo

public class MyClass 
{ 
    [MyAttribute(Converter="ConverterMethod")] 
    public string Prop { get; set; } 

    public static string ConverterMethod(string src) 
    { 
     return src + " converted"; 
    } 
} 

¿Cuál es la manera 'correcta' de hacer eso?

Estas son las formas que veo: propiedad de cadena

  1. Marca y método correspondiente extracto con la reflexión en tiempo de ejecución
  2. Hacer Dictionary<string, Func<string, string>> y rellenarla con los métodos correspondientes durante el tiempo de ejecución. A continuación, extraiga el método utilizando la propiedad de cadena del atributo como clave. Este método es más resistente a la refactorización, si cambio el nombre del método todo funcionará (la clave del diccionario seguirá siendo la misma)
  3. Haga la interfaz 'IConverter' y pase typeof(ConverterImpl) al atributo. Luego, cree una instancia de convertidor durante el tiempo de ejecución y use su interfaz para convertir valores. De esta manera me parece lo mejor, pero nunca utilicé las propiedades Type en los atributos y ni siquiera sé si están bien serializadas.

¿Qué enfoque es el mejor? ¿Hay otros enfoques? ¿Cómo la gente suele hacer tales cosas?

Respuesta

2

La primera opción es bastante normal y tiene la ventaja de la simplicidad. Tiene razón al decir que es un poco susceptible a la refactorización, pero ... esto rara vez es un problema "real".

Otro (cuarto) enfoque, sin embargo, sería hacer el atributo abstracto con un método abstracto, y subclasificarlo con el código de conversión en el atributo - entonces en tiempo de ejecución puede obtener el atributo (como el atributo base) y simplemente llame al método virtual, este enfoque es común en cosas como MVC.

Personalmente, suelo usar la primera opción, junto con las pruebas unitarias de seguridad (en caso de refactorización, etc.).

Cuestiones relacionadas