Implementation de INotifyPropertyChanged - existe-t-il une meilleure methode ?

Implementation de INotifyPropertyChanged - existe-t-il une meilleure methode ?

Sans utiliser quelque chose comme postsharp, la version minimale que nous utilisons ressemble a ceci :

public class Data : INotifyPropertyChanged
{
    // boiler-plate
    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }
    protected bool SetField<T>(ref T field, T value, string propertyName)
    {
        if (EqualityComparer<T>.Default.Equals(field, value)) return false;
        field = value;
        OnPropertyChanged(propertyName);
        return true;
    }

    // props
    private string name;
    public string Name
    {
        get { return name; }
        set { SetField(ref name, value, "Name"); }
    }
}

Chaque propriete se resume alors a quelque chose comme :

private string name;
public string Name
{
    get { return name; }
    set { SetField(ref name, value, "Name"); }
}

ce qui n’est pas enorme ; cela peut egalement etre utilise comme classe de base si vous le souhaitez. Le retour bool de SetField vous indique si c’etait une operation sans effet, au cas ou vous voudriez appliquer une autre logique.

ou encore plus facilement avec C# 5 :

protected bool SetField<T>(ref T field, T value,
    [CallerMemberName] string propertyName = null)
{...}

qui peut etre appele comme ceci :

set { SetField(ref name, value); }

avec quoi le compilateur ajoutera automatiquement "Name".

C# 6.0 rend l’implementation plus facile :

protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}

…et maintenant avec C#7 :

protected void OnPropertyChanged(string propertyName)
   => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));

protected bool SetField<T>(ref T field, T value,[CallerMemberName] string propertyName =  null)
{
    if (EqualityComparer<T>.Default.Equals(fiel

(Reponse tronquee)