2008-09-22 39 views
6

我想知道是否有任何方法將自定義行爲添加到自動屬性get/set方法。C#3.0自動屬性 ​​- 是否可以添加自定義行爲?

我能想到的一個明顯情況是希望每個設置屬性方法都可以調用任何PropertyChanged事件處理程序,作爲System.ComponentModel.INotifyPropertyChanged實現的一部分。這將允許一個類有許多可以觀察到的屬性,其中每個屬性都是使用自動屬性語法定義的。

基本上我想知道是否有任何類似的get/set模板或類後範圍後獲取/設置鉤。

(我知道的同一端的功能可以很容易地在稍微詳細的方式來實現 - 我只是討厭的模式重複)

回答

17

不,你必須使用自定義的行爲「傳統」的定義的屬性。

1

如果這是一種在開發過程中會重複的行爲,您可以爲您的特殊類型的屬性創建自定義代碼段。

4

不,您不能:自動屬性是顯式訪問者到私人字段的快捷方式。例如

public string Name { get; set;} 

是一個捷徑

private string _name; 
public string Name { get { return _name; } set { _name = value; } }; 

如果你想要把自定義的邏輯,你必須編寫,並得到明確設置。

1

你可以考慮使用PostSharp編寫setter的攔截器。這是LGPL和GPLed取決於你使用的庫的哪一部分。

1

我能想到的最接近的解決方案是使用一個輔助方法:

public void SetProperty<T>(string propertyName, ref T field, T value) 
{ field = value; 
    NotifyPropertyChanged(propertyName); 
} 

public Foo MyProperty 
{ get { return _myProperty} 
    set { SetProperty("MyProperty",ref _myProperty, value);} 
} Foo _myProperty; 
2

查找到PostSharp。這是一個典型問題的AOP框架,「這種代碼模式我每天都在匆匆忙忙地做什麼,我該如何實現自動化?」。 你可以用PostSharp這個(例如)簡化:

public Class1 DoSomething(Class2 first, string text, decimal number) { 
    if (null == first) { throw new ArgumentNullException("first"); } 
    if (string.IsNullOrEmpty(text)) { throw new ArgumentException("Must be not null and longer than 0.", "text") ; } 
    if (number < 15.7m || number > 76.57m) { throw new OutOfRangeArgumentException("Minimum is 15.7 and maximum 76.57.", "number"); } 

    return new Class1(first.GetSomething(text), number + text.Lenght); 
} 

public Class1 DoSomething([NotNull]Class2 first, [NotNullOrEmpty]string text, [InRange(15.7, 76.57)]decimal number) { 
     return new Class1(first.GetSomething(text), number + text.Lenght); 
} 

但是,這還不是全部! :)

相關問題