N'oubliez pas une chose : PropertyChanged
événement est principalement consommée par les composants qui vont utiliser la réflexion pour obtenir la valeur de la propriété nommée.
L'exemple le plus évident est la liaison de données.
Quand vous tirez PropertyChanged
événement, en passant le nom de la propriété en tant que paramètre, vous devez savoir que l'abonné de cet événement est susceptible d'utiliser la réflexion en appelant, par exemple, GetProperty
(au moins la première fois, si il utilise un cache de PropertyInfo
), alors GetValue
. Ce dernier appel est une invocation dynamique (MethodInfo.Invoke) de la propriété méthode de lecture, qui coûte plus de l' GetProperty
dont seules les requêtes de meta-données. (À noter que la liaison de données s'appuie sur l'ensemble de la TypeDescriptor chose, mais l'implémentation par défaut utilise la réflexion.)
Alors, bien sûr, en utilisant le code de la propriété des noms lors de la cuisson PropertyChanged est plus efficace que l'utilisation de la réflexion dynamiquement pour obtenir le nom de la propriété, mais à mon humble avis, il est important pour l'équilibre de votre pensées. Dans certains cas, la charge de travail n'est pas que critique, et vous pourriez profiter d'une quelconque fortement typé événement mécanisme de tir.
Voici ce que j'utilise parfois en C# 3.0, quand les performances ne serait pas un souci :
public class Person : INotifyPropertyChanged
{
private string name;
public string Name
{
get { return this.name; }
set
{
this.name = value;
FirePropertyChanged(p => p.Name);
}
}
private void FirePropertyChanged<TValue>(Expression<Func<Person, TValue>> propertySelector)
{
if (PropertyChanged == null)
return;
var memberExpression = propertySelector.Body as MemberExpression;
if (memberExpression == null)
return;
PropertyChanged(this, new PropertyChangedEventArgs(memberExpression.Member.Name));
}
public event PropertyChangedEventHandler PropertyChanged;
}
Remarquez l'utilisation de l'expression de l'arbre pour obtenir le nom de la propriété, et l'utilisation de l'expression lambda comme un Expression
:
FirePropertyChanged(p => p.Name);