我有一个实现INotifyPropertyChanged的类,如下所示:
public class Person : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; string _color; public string Color { get{ return _color; } set { _color = value; RaisePropertyChanged(); } } ... private void RaisePropertyChanged([CallerMemberName]string prop = "") { if (PropertyChanged != null) PropertyChanged(this,new PropertyChangedEventArgs(prop)); } }
调用Color属性setter时,它调用RaisePropertyChanged(),它自动获取属性名称,即“Color”,并使用它来填充PropertyChangedEventArgs.而不是您手动键入属性名称.
这很好,因为它可以防止代码中的可能错误,因为您不必手动键入属性名称.在重构代码时也很有帮助,因为您不需要对任何字符串进行硬编码.
我的问题
我有一个PropertyChanged的事件处理程序.如何在不将Property Names硬编码为字符串的情况下使用switch-case结构.所以像这样:
void Person_PropertyChanged(object sender,PropertyChangedEventArgs e){ switch (e.PropertyName) { case PropertyNameOf(Person.Color); //some stuff break; default: break; } }
这可能吗?我想这样做,所以我可以保留上面提到的好处.
解决方法
您可以使用Expression< Func< T>>做你想做的事.
定义此方法:
private string ToPropertyName<T>(Expression<Func<T>> @this) { var @return = string.Empty; if (@this != null) { var memberExpression = @this.Body as MemberExpression; if (memberExpression != null) { @return = memberExpression.Member.Name; } } return @return; }
然后你可以这样写:
void Person_PropertyChanged(object sender,PropertyChangedEventArgs e){ switch (e.PropertyName) { case ToPropertyName(() => Person.Color); //some stuff break; default: break; } }
现在你有一些强烈的喜悦. 原文链接:https://www.f2er.com/csharp/96465.html