2012-04-20 5 views
11

NotificationObjectで、この方法の一つのオーバーロードがあります: - 私たちは、プロパティのセッターで次のように書くRaisePropertyChanged <T>はどのようにプロパティ名を検出しますか?

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

RaisePropertyChanged(() => PropertyVariable); 

それが動作するどのように?このラムダ式からプロパティ名をどのように見つけますか?

+0

これは、それが行うことができる方法について説明します。http://stackoverflow.com/questions/141370/inotifypropertychanged-property-name-hardcode- vs-reflection – Henrik

+1

C#5では、反射マジックは必要ありません。http://www.robfe.com/2011/09/raising-the-right-propertychanged-with-c-5s-caller-info -attributes/ – Vlad

+0

ここでresharperを提案することはできません。メソッド定義(F12)を実行しようとすると簡単に逆コンパイルされます。あなたはリフレクターのように他のデコンパクターも確実に使うことができます。 – mkb

答えて

15

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); 
} 
関連する問題