2010-10-29 57 views
0

有沒有可能重寫這個擴展方法的參數?是否有可能重寫這個棘手的擴展方法?

public static string PropertyName<T>(this T obj, Expression<Func<T>> property) 
{ 
    var memberExpression = property.Body as MemberExpression; 
    if (memberExpression == null) 
     throw new ArgumentException("Expression must be a MemberExpression.", "property"); 
    return memberExpression.Member.Name; 
} 

這是該函數的測試代碼。

string TEST = Guid.NewGuid().ToString(); 
string propertyName = TEST.PropertyName(() => TEST); 

這是結果:

propertyName = "TEST" 

我想代碼重寫本:

string propertyName = TEST.PropertyName(); 

詩篇。我對這種方法的靜態版本不感興趣!

對於那些怎麼看不到這個功能的重點。 在MVVM模式中,您已通知已更改屬性。 喜歡這個。

this.RaisePropertyChanged("TEST"); 

這是一個壞方法,因爲屬性名稱是硬編碼的。 隨着擴展方法的幫助下,你都會有這樣的:

this.RaisePropertyChanged(()=>Test); 

我想擴展方法改寫爲這樣的:

this.RaisePropertyChanged(Test.PropertyName()); 

下面是我的MVVM項目的代碼示例。 (這是一個Model屬性)

public DateTime Start 
{ 
    get { return WorkModel.Start; } 
    set 
    { 
     if (WorkModel.Start != value) 
     { 
      WorkModel.Start = new DateTime(SelectedDate.Year, SelectedDate.Month, SelectedDate.Day, value.Hour, value.Minute, value.Second); 
      this.RaisePropertyChanged("Start"); 
      this.RaisePropertyChanged("TotalWork"); 
     } 
    } 
} 
+1

你會如何使用它? – 2010-10-29 05:50:16

+0

請仔細閱讀該問題。 「TEST.PropertyName();」 – 2010-10-29 05:51:23

+0

它返回屬性的名稱。這在MVVM模式中很有用。 – 2010-10-29 05:55:31

回答

1

不,這是不可能的。局部變量名稱僅用於編譯器,不會被記錄或可在編譯期間重命名。

當然屬性是不同的東西。你應該知道你的第一個例子與第二個例子不同。

但是,我沒有看到一種方法,你可以實現這一點。即使如此,它會比你的工作()=> PropertyName類型的調用更大的性能殺手。

+0

當你使用反射時,你可能需要這個函數,當你使用obj.GetType()。GetProperty(「PropertyName」) – 2010-10-29 06:05:55

相關問題