2014-04-22 6 views
29

Ich sehe zwei Arten der Umsetzung von INotifyPropertyChangedWas ist [NotifyPropertyChangedInvocator] in C# beim Implementieren von INotifyPropertyChanged?

  • Die ersten:

    public abstract class ViewModelBase : INotifyPropertyChanged 
    { 
        public event PropertyChangedEventHandler PropertyChanged; 
    
        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
        { 
         PropertyChangedEventHandler handler = PropertyChanged; 
         if (handler != null) 
         { 
          handler(this, new PropertyChangedEventArgs(propertyName)); 
         } 
        } 
    } 
    
  • Die zweiten:

    public abstract class ViewModelBase : INotifyPropertyChanged 
    { 
        public event PropertyChangedEventHandler PropertyChanged; 
    
        [NotifyPropertyChangedInvocator] 
        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
        { 
         PropertyChangedEventHandler handler = PropertyChanged; 
         if (handler != null) 
         { 
          handler(this, new PropertyChangedEventArgs(propertyName)); 
         } 
        } 
    } 
    

In zweit man Sie dort zu sehen ist ein zusätzliches Attribut [NotifyPropertyChangedInvocator] über die Methode OnPropertyChanged

In meinem Fall verhalten sich beide gleich, aber was, warum und wann dieses [NotifyPropertyChangedInvocator] zu verwenden, was sind Vorteile davon? Ich habe im Internet gesucht, konnte aber keine gute Antwort finden.

Antwort

4

Die NotifyPropertyChangedInvocator ist eine Resharper Funktion.

Sie können einfach aus dem Code entfernen, um für sie

zu arbeiten

ähnliche Frage wurde hier gefragt:

does anyone know how to get the [NotifyPropertyChangedInvocator]

+0

Ist ein C# -Feature. Resharper ist nur ein Tool und kann keinen zusätzlichen Code hinzufügen, der C# nicht unterstützt. Es gibt auch etwas hinter NotifyPropertyChangedInvocator. –

+0

Dann sagen Sie [CallerMemberName] wird auch von Resharper hinzugefügt, durch das Entfernen des Codes funktioniert auch, aber CallMemberName lösen Kopfschmerzen von geben Namen oder Eigenschaften, wo wir es nennen. Gleiche möchte ich über NotifyPropertyChangedInvocator wissen es Check http://www.kunal-chowdhury.com/2012/07/whats-new-in-c-50-learn-about.html –

+0

@WaqasIdrees CallMemberName ist ein Feature von C# mit .net 4.5. Ermöglicht es Ihnen, die Methode oder den Eigenschaftsname des Aufrufers für die Methode abzurufen. Können Sie beweisen, dass NotifyPropertyChangedInvocator mit C# geliefert wird?seit Sie haben – Sajeetharan

57

Es ist ein ReSharper Attribut von ihrer Annotations - entworfen, um Sie Warnung dann Ihr Code sieht verdächtig :)
Bedenken Sie:

public class Foo : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    [NotifyPropertyChangedInvocator] 
    protected virtual void NotifyChanged(string propertyName) { ... } 

    private string _name; 
    public string Name { 
     get { return _name; } 
     set { 
      _name = value; 
      NotifyChanged("LastName");//<-- warning here 
      } 
    } 
    } 

Mit dem [NotifyPropertyChangedInvocator] Attribut auf der NotifyChanged Methode gibt Resharper Ihnen eine Warnung, dass Sie die Methode mit einem (vermutlich) falschen Wert aufrufen.

Da ReSharper jetzt weiß dass Methode sollte machen Änderungsmitteilung genannt werden, wird es Ihnen helfen normalen Eigenschaften in Objekte mit Änderungsbenachrichtigung konvertieren: enter image description here
es in diese Konvertierung:

public string Name 
{ 
    get { return _name; } 
    set 
    { 
    if (value == _name) return; 
    _name = value; 
    NotifyChange("Name"); 
    } 
} 



Dieses Beispiel stammt aus der Dokumentation zum [NotifyPropertyChangedInvocator] Attribut, das Sie hier finden:
enter image description here

+9

Plus 1 für die Erklärung, und nicht nur mit einem Link zu beantworten. Dies sollte als Antwort gewählt werden. – user3791372

Verwandte Themen