Как RaisePropertyChanged <T> узнает имя свойства?

Существует одна перегрузка этого метода в NotificationObject: -

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

Мы пишем следующим образом в установщике свойства:

RaisePropertyChanged(() => PropertyVariable);

Как это работает? Как он находит имя свойства из этого выражения Lambda?

Ответ 1

An Expression<TDelegate> представляет абстрактное синтаксическое дерево лямбда-выражения. Поэтому вам просто нужно проанализировать это дерево синтаксиса, чтобы узнать имя свойства:

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);
}