No olvide una cosa: PropertyChanged
evento es consumido principalmente por componentes que usan la reflexión para obtener el valor de la propiedad indicada.
El ejemplo más obvio es el enlace de datos.
Cuando dispares PropertyChanged
evento, pasando el nombre de la propiedad como un parámetro, usted debe saber que el suscriptor de este evento es probable que utilizar la reflexión llamando, por ejemplo, GetProperty
(al menos la primera vez si usa un caché de PropertyInfo
), luego GetValue
. Esta última llamada es una invocación dinámica (MethodInfo.Invoke) del método getter de la propiedad, que cuesta más que el GetProperty
que solo consulta metadatos. (Tenga en cuenta que el enlace de datos se basa en todo el asunto TypeDescriptor, pero la implementación predeterminada usa la reflexión.)
Así que, por supuesto, utilizar nombres de propiedades de código duro al activar PropertyChanged es más eficiente que utilizar la reflexión para obtener dinámicamente el nombre del propiedad, pero en mi humilde opinión, es importante equilibrar sus pensamientos. En algunos casos, la sobrecarga del rendimiento no es tan crítica, y podría beneficiarse de algún tipo en el mecanismo de activación de eventos fuertemente tipados.
Esto es lo que uso a veces en C# 3.0, cuando las actuaciones no sería una preocupación:
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;
}
Aviso el uso del árbol de expresión para obtener el nombre de la propiedad, y el uso de la lambda expresión como Expression
:
FirePropertyChanged(p => p.Name);
.NET 4.5 ofrece una buena solución para esto con el atributo [CallerMemberName]. Vea un ejemplo de su uso en la documentación de MSDN http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged(v=vs.110).aspx –