问题 RaisePropertyChanged 如何找到属性名称?


这个方法有一个重载 NotificationObject : -

protected void RaisePropertyChanged<T>(Expression<Func<T>> propertyExpression);

我们在以下方式写入属性的setter:

RaisePropertyChanged(() => PropertyVariable);

它是如何工作的?它如何从这个Lambda表达式中找到属性名称?


5234
2018-04-20 09:11


起源

这描述了如何完成它: stackoverflow.com/questions/141370/... - Henrik
在C#5中,你甚至不需要反射魔法: robfe.com/2011/09/... - Vlad
我不禁在这里建议resharper,当你尝试去方法定义时很容易反编译(F12)。您也可以使用其他反编译器,就像反射器一样。 - mkb


答案:


一个 Expression<TDelegate> 表示lambda表达式的抽象语法树。所以你只需要分析这个语法树来找出属性名称:

protected void RaisePropertyChanged<T>(Expression<Func<T>> propertyExpression)
{
    var memberExpr = propertyExpression.Body as MemberExpression;
    if (memberExpr == null)
        throw new ArgumentException("propertyExpression should represent access to a member");
    string memberName = memberExpr.Member.Name;
    RaisePropertyChanged(memberName);
}

15
2018-04-20 09:15