2009-11-02 6 views
6

C'est juste quelque chose que je pensais pendant que j'apprenais sur les attributs et j'utilisais trop l'INotifyPropertyChanged, est juste et Idea et j'aimerais entendre quelques opinios à ce sujet. (Je sais ceci nécessiterait un travail sur le compilateur et non sur le côté du cosomme)Utilisation des attributs ... INotifyPropertyChanged

Depuis INotifyPropertyChanged est utilisé avec le même motif la plupart du temps .. tout comme appeler la méthode qui déclenche l'événement avec le nom de la propriété, pourrait-il être conçu comme et Attribute et en utilisant Auto-Propriétés? Alors que le compilateur sait qu'il doit ajouter l'appel à l'événement PropertyChanged? Donc, si nous avons la classe ....

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; 
     ... 
} 

Au lieu de déclarer la propriété

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

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

nous pourrions faire quelque chose comme cela si nous pouvons indiquer au compilateur par cet attribut qu'il doit générer un appel à la PropertyChanged avec le nom de la propriété si la nouvelle valeur est différente de la précédente

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

On pourrait encore garder le codage en t il ancienne pour certains comportements personnalisés lorsqu'aucune en utilisant l'attribut ..

Répondre

8

Vous pouvez do this avec PostSharp, mais je ne pense pas que ce sera dans le compilateur de base dans un proche avenir.

4

Ce style de pensée est appelée programmation orientée aspect (AOP ou). Vous pouvez obtenir le résultat final en ajoutant une action de génération de message à l'aide de Cecil de Mono pour parcourir les propriétés avec cet attribut et modifier le comportement de la propriété et cracher l'assemblage nouvellement compilé avec le comportement approprié. Vous pouvez regarder l » DimecastJason Bock sur « Leveraging Cecil to inject code into your Assemblies »

+0

Très bonne lecture .. Merci beaucoup ... J'ai commencé à utiliser postsharp ... c'est pourquoi je pointe l'autre réponse. Mais c'est utile aussi. – jmayor

7

Dans le cas où quelqu'un se trouve dans ce fil et utilise C# 5 (VS 2012+, .NET 4.5+). Ce cas se fait "plus facilement" maintenant avec CallerMemberNameAttribute. Cet attribut est appliqué à un paramètre de chaîne et entraîne le passage du compilateur dans le nom de la méthode/propriété appelante lorsque la valeur par défaut us est utilisée (c'est-à-dire quand et argument n'est pas passé). Rendre la mise en œuvre INotifyPropertyChanged moins fatigante. Par exemple:

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)); 
    } 
} 

Donc, vous avez juste besoin OnPropertyChanged() dans chaque compositeur d'envoyer l'événement et ne pas faire face à une chaîne codée en dur pour le nom de la propriété.

Questions connexes