【问题标题】:How RaisePropertyChanged<T> finds out the property name?RaisePropertyChanged<T> 如何找出属性名称?
【发布时间】:2012-04-20 09:11:55
【问题描述】:

NotificationObject 中有一个此方法的重载:-

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

我们在属性的setter中这样写:

RaisePropertyChanged(() => PropertyVariable);

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

【问题讨论】:

  • 这描述了它是如何完成的:stackoverflow.com/questions/141370/…
  • 在 C# 5 中,你甚至不需要反射魔法:robfe.com/2011/09/…
  • 我忍不住在这里建议 resharper,当你尝试去方法定义(F12)时,它很容易反编译。你也可以使用其他反编译器,比如反射器。

标签: .net c#-4.0 lambda


【解决方案1】:

Expression&lt;TDelegate&gt; 表示 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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-07
    • 2018-07-30
    • 1970-01-01
    • 2017-10-23
    • 2011-08-30
    • 1970-01-01
    相关资源
    最近更新 更多