2012-06-10 27 views
3

我一直在使用的MVP線了在C#中的一些的WinForms。 UI開發不完全是我的強大套件,我一直在尋找一種重構證明的方式來實現INotifyPropertyChanged,而不必訴諸字符串來觸發更改通知。INotifyPropertyChanged的針對C#.NET 3.0

msdn的例子http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx和我見過的其他人大多數都認爲我錯誤地做了這樣的事情,即在重構屬性的情況下必須更改字符串。

我在使用表達式和func,遺留設備中遺留的設備中看到的所有其他選項我支持的遺留解決方案中,所以我想知道如果任何人有一種方法來複制使用表達式樹的當前解決方案屬性名稱。

我已經看到了解決方案的一個例子。

public static string GetPropertyName<T, TReturn>(Expression<Func<T, TReturn>>  expression) 
{ 
MemberExpression body = (MemberExpression)expression.Body; return body.Member.Name; 
} 

乾杯

+0

單元測試..... – BFree

+1

... **重構證明** ... *真的......真的嗎?* – IAbstract

+0

@Bernard您認爲哪些示例在.NET中不受支持3.0?我在3.5,4.0和即將推出的版本中可以想到的新功能是並行擴展,可選和命名參數,動態和異步,但是,這些與這個問題無關。 –

回答

6

對於.NET 3.0,落實實施INotifyPropertyChanged的重構,證明的方式最好的辦法是通過某種形式的代碼生成的。例如,PostSharp(AOP工具)使用IL編織在後編譯步驟中修改生成的程序集。您可以在INotifyPropertyChangedhere找到相關示例。

順便說一下,執行INotifyPropertyChangedthe state of the art (C# 5) way根本不需要任何特殊工具:有[CallerMemberName] attribute

+0

嗨,阿尼,謝謝你的例子,看起來不錯,我會試試看,並報告回來..乾杯! – Bernard

+0

你已經非常有幫助,我想在你提供的鏈接PostSharp的方式,但它使用AOP繼承這不是免費分發的一部分。再次歡呼 – Bernard

+0

完成傳統方式,因爲我們還沒有在C#5上 – Bernard