2009-12-04 38 views
1

我使用的是使用一系列按鈕MVVM和我的虛擬機的一個內我有一個IsEditable財產(以及它們都從基類做),以確定是否他們的命令可火。使用反射來得到一個變量的名稱

該虛擬機還有一個子虛擬機,我需要將此IsEditable屬性回顯爲當前我正在覆蓋我的OnPropertyChanged方法,以檢查正在刷新的屬性是否爲.Equals("IsEditable")

我有一個嘮叨,這告訴我這不是一個好習慣,如果這個IsEditable在將來被重新命名,那麼這個功能將會默默地打破。有沒有更好的方式來做到這一點,或者能夠與反射使用屬性的名稱,例如:

if (propertyRefreshName.Equals(IsEditable.Name)) 
{ 
    // Echo down IsEditable change.... 
} 
+0

使用在時間關鍵代碼反射通常不是一個好主意,因爲它可能會很慢。這聽起來像你將在UI線程中運行這個。起初放緩可能並不明顯,但隨着時間的推移,您可能會注意到您的應用程序開始爬行,因爲沒有明顯的原因。我會推薦一個像Reed所建議的通知機制。 – Dolphin 2009-12-04 18:00:10

回答

3

你可以潛在地,使用同樣的伎倆與人們用來執行INotifyPropertyChanged表達式。 Eric De Carufel blogged about this

如果使用相同的技術,你可以寫你的代碼爲:

if (IsPropertyName(() => this.IsEditable, propertyRefreshName)) 
{ ... } 

這只是需要實現一個函數來檢查屬性名,但讓你在不的方式做到這一點使用硬編碼的字符串。

+0

你的鏈接裏面有'_22',它打破了它。應該http://blog.decarufel.net/2009/07/how-to-use-inotifypropertychanged-type.html – statenjason 2009-12-04 17:49:50

+0

槽糕......兩者都爲我工作。該_22是後天的修訂...... – 2009-12-04 17:55:01

+0

我得到「抱歉,您正在尋找在博客埃裏克·德C#的頁面不存在」去它的時候。 – statenjason 2009-12-04 18:01:04

1

嘗試擴展方法來獲得屬性名稱關閉對象

public static class ObjectExtensions 
{ 
    public static string PropertyName<T,TOut>(this T source, Expression<Func<T,TOut>> property) 
    { 
     var memberExpression = (MemberExpression) property.Body; 
     return memberExpression.Member.Name; 
    } 
} 

然後在你的OnPropertyChanged添加

if(propertyRefreshName == this.PropertyName(x => x.IsEditable)) 
    SubVM.IsEditable = IsEditable; 
相關問題