2009-11-02 28 views
6

Esto es solo algo en lo que estaba pensando cuando estaba aprendiendo sobre atributos y estaba usando el INotifyPropertyChanged demasiado, es justo e idea y me gustaría escuchar algunas opiniones al respecto. (Lo sé esto requeriría algo de trabajo en el compilador y no en el lado del cliente)Uso de atributos ... INotifyPropertyChanged

Dado que INotifyPropertyChanged se usa con el mismo patrón la mayoría de las veces ... igual que llamar al método que activa el evento con el nombre de la propiedad, ¿podría diseñarse como Atributo y usar propiedades automáticas? ¿Para que el compilador sepa que necesita agregar la llamada al evento PropertyChanged? Así que si tenemos la clase ....

public class DemoCustomer : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private void NotifyPropertyChanged(String info) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(info)); 
     } 
    } 

    private string companyNameValue = String.Empty; 
     ... 
} 

En lugar de declarar la propiedad

public string CompanyName 
    { 
     get 
     { 
      return this.companyNameValue; 
     } 

     set 
     { 
         if (value != this.companyNameValue) 
         { 
          this.companyNameValue = value; 
          NotifyPropertyChanged("CompanyName"); 
         } 
     } 
    } 

podríamos hacer algo como esto si podemos indicar al compilador de este atributo que necesita generar una llamada al PropertyChanged con el nombre de la propiedad si el nuevo valor es diferente de la anterior

[NotifyPropertyChanged] 
public string CompanyName 
{ 
    get;set; 
} 

todavía podíamos mantener la codificación en t El viejo camino para algunos comportamientos personalizados cuando no se usa el Atributo.

Respuesta

8

Puede do this con PostSharp, pero no creo que va a ser en el compilador de núcleo en el corto plazo.

4

Este estilo de pensamiento se denomina Programación Orientada a Aspectos (o AOP). Puede lograr el resultado final agregando una acción posterior a la construcción usando Cecil de Mono para recorrer las propiedades con ese atributo y modificar el comportamiento de la propiedad y escupir el ensamblado recién compilado con el comportamiento apropiado. Se puede ver en Jason Bock 's Dimecast en 'Leveraging Cecil to inject code into your Assemblies'

+0

Muy buena lectura ... Muchas gracias ... Empecé a usar postharp ... por eso estoy señalando la otra respuesta. Pero esto también es útil. – jmayor

7

En caso de que alguien pase por este hilo y esté usando C# 5 (VS 2012+, .NET 4.5+). Este caso se hace "más fácilmente" ahora con CallerMemberNameAttribute. Este atributo se aplica a un parámetro de cadena y hace que el compilador pase el nombre del método/propiedad de llamada cuando se usa el valor predeterminado us (es decir, cuando y el argumento no se pasa). Haciendo que la implementación de INotifyPropertyChanged sea menos tediosa. Por ejemplo:

public class MyClass 
{ 
    private string myProperty; 

    public string MyProperty 
    { 
     get { return myProperty; } 
     set 
     { 
      myProperty = value; 
      OnPropertyChanged(); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     var handler = PropertyChanged; 
     if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

Por lo tanto, sólo tiene OnPropertyChanged() en cada colocador para enviar el evento y no tener que lidiar con una cadena fija para el nombre de la propiedad.

Cuestiones relacionadas