<p>Sans utiliser quelque chose comme postsharp, la version minimale que nous utilisons ressemble a ceci :</p>
<pre><code class="lang-auto">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"); }
}
}
</code></pre>
<p>Chaque propriete se resume alors a quelque chose comme :</p>
<pre><code class="lang-auto">private string name;
public string Name
{
get { return name; }
set { SetField(ref name, value, "Name"); }
}
</code></pre>
<p>ce qui n’est pas enorme ; cela peut egalement etre utilise comme classe de base si vous le souhaitez. Le retour <code>bool</code> de <code>SetField</code> vous indique si c’etait une operation sans effet, au cas ou vous voudriez appliquer une autre logique.</p>
<p>ou encore plus facilement avec C# 5 :</p>
<pre><code class="lang-auto">protected bool SetField<T>(ref T field, T value,
[CallerMemberName] string propertyName = null)
{...}
</code></pre>
<p>qui peut etre appele comme ceci :</p>
<pre><code class="lang-auto">set { SetField(ref name, value); }
</code></pre>
<p>avec quoi le compilateur ajoutera automatiquement <code>"Name"</code>.</p>
<p>C# 6.0 rend l’implementation plus facile :</p>
<pre><code class="lang-auto">protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
</code></pre>
<p>…et maintenant avec C#7 :</p>
<pre><code class="lang-auto">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
</code></pre>
<p><em>(Reponse tronquee)</em></p>