RaisePropertyChanged <T>如何找到属性名称?

tee*_*nup 11 .net lambda c#-4.0

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

protected void RaisePropertyChanged<T>(Expression<Func<T>> propertyExpression);
Run Code Online (Sandbox Code Playgroud)

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

RaisePropertyChanged(() => PropertyVariable);
Run Code Online (Sandbox Code Playgroud)

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

Tho*_*que 15

An 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);
}
Run Code Online (Sandbox Code Playgroud)