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;
}
}
现在你有一些强烈的喜悦. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
