c# – Class.PropertyName上的Switch-Case(非值)
发布时间:2020-12-15 17:37:52 所属栏目:百科 来源:网络整理
导读:我有一个实现INotifyPropertyChanged的类,如下所示: public class Person : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; string _color; public string Color { get{ return _color; } set { _color = value; Rai
我有一个实现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.而不是您手动键入属性名称. 这很好,因为它可以防止代码中的可能错误,因为您不必手动键入属性名称.在重构代码时也很有帮助,因为您不需要对任何字符串进行硬编码. 我的问题 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; } } 现在你有一些强烈的喜悦. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |