2011-11-15 40 views
3

當我爲WinForms和ASP.NET進行用戶控件時,我發現自己爲表單上的每個屬性重複編寫了相同的代碼段,這就是:在Winforms和ASP.NET中重構

private string _url; 

public string Url 
{ 
    get { return _url; } 
    set 
    { 
    if (_url == value) 
     return; 

    _url = value; 
    OnUrlChange(EventArgs.Empty); 
    } 
} 

public event EventHandler UrlChanged; 

protected virtual void OnUrlChange(EventArgs e) 
{ 
    //Maybe add some extra logic here 

    if(UrlChanged != null) 
    UrlChanged(this, e); 
} 

有時會發生奇怪的變化。也許我會寫我自己的課程,從EventArgs派生並使用它。

這似乎是它必須是一個共同的任務。也許我做錯了,並且有更簡單的方法來寫這個地段?但是,如果沒有,是否有任何自定義重構工具,我可以設置填寫此代碼給定屬性名稱Url

+0

我不是一個.NET人,也不確定我是否理解你,但我猜你的意圖是每次更新屬性時通知另一個元素(可能是UI上的某個元素)(例如調用set *方法)。 你是對的,認爲這是非常普遍的任務,而不是努力創建一個父類或代碼片段生成器,我會看看這個行爲已經在API中實現的位置,因爲我確定它是。 – kcdragon

+0

我會這樣想的。 .NET框架中的大多數控件都有這個或者非常類似的代碼。有幾種不同的實現方式,儘管這會使行爲不同,所以將其壓低得遠遠超過這會消除一些靈活性。 – Connell

+0

不幸的是,我曾經反編譯過的所有.NET庫代碼遵循長期模式,並且我很確定沒有任何內置解決方案。 @ user617090:您是否使用具有此功能的平臺?它看起來如何? –

回答

2

你的模式很常見,而且幾乎是最好的方法。

這就是說,你一定要用Visual Studio Snippets。他們允許輕鬆地爲這樣的代碼創建模板。您可以定義自己的佔位符,並且在插入代碼段時,Visual Studio將突出顯示佔位符並允許您通過它們進行選項卡。

我還建議使用Snippet Designer插件,它可以使創建代碼片更容易,更有趣。這也有助於找出您不知道存在的片段功能。

+1

Snippet designer = Gold – Connell

1

是否有任何自定義重構工具,我可以設置填寫此代碼給定屬性名稱Url

你可以創建自己的code snippet來做到這一點。

+0

哦,我說!我沒有意識到你可以推出你自己的代碼片段。一直以爲他們是微軟標準的東西。每天都是學校的一天。 – Connell

+0

@ConnellWatkins - Visual Studio具有令人難以置信的可擴展性。 – Oded

0

這取決於你的架構,但是如果你想減少冗餘,你可以創建一個包含任何共享屬性和方法的基類,並讓你的控件繼承它。

+0

這是我希望能夠重複的模式,而不是實際的方法和屬性。例如,我希望能夠在其他地方做同樣的事情,但是使用'Text'屬性,'_text'字段,'TextChanged'事件和'OnTextChanged'方法。 – Connell

2

一些幾個月前,我曾想過這一點,並使用此玩弄:

public event PropertyChangedEventHandler PropertyChanged; 

    int _MyProperty; 
    public int MyProperty 
    { 
     get { return _MyProperty; } 
     set { ChangeIfUnequal(ref _MyProperty, value, "MyProperty"); } 
    } 

    int _AnotherProperty; 
    public int AnotherProperty 
    { 
     get { return _AnotherProperty; } 
     set { ChangeIfUnequal(ref _AnotherProperty, value); } 
    } 


    void ChangeIfUnequal<T>(ref T Val, T NewValue, string Identifier="") 
    { 
     if (!Val.Equals(NewValue)) 
     { 
      Val = NewValue; 
      var temp = PropertyChanged; 
      if(temp != null) 
       temp(this, new PropertyChangedEventArgs(Identifier)); 
     } 
    } 

但我從來沒有運行它在生產,沒有花足夠的時間來想,如果這是一個很小的改進或不必要的複雜化。毫無疑問,它不像在每個房產中明確設置那樣靈活,因爲這隻會在等於!我想,拿走它或離開它。

+0

這是一個很好的答案,因爲它非常接近OP的要求。但是,這也表明解決方案並不比問題好得多。 –

+0

質量的答案。 +1,但我已經接受了片段方法,因爲這就是我最終做到的方式。絕對是最有趣的答案。如果我能+10,我會:P – Connell