2009-12-04 64 views
1

在C#中有一種方法讓setter從「something」繼承,這將允許我在每次爲特定基類調用setter時運行一些代碼,並且它的繼承者?C#自定義Setter事件或繼承設置器

我想要做的是在我的基類名爲IsValid布爾標誌。驗證一個對象後,我會將此布爾值設置爲true,那麼如果在驗證之後調用任何setter,我希望setter將IsValid標誌更改爲false。

我不想把這個邏輯寫入每個setter。

+1

的問題是,C#不具備這樣的特定功能,也缺少一些的元編程能力,從而將允許Brian Rudolph在下面給出的例子幾乎自動化。一種能夠使用這種技巧的.NET語言是Boo,您可以在其中定義一個MetaAttribute,以擴展爲與該示例代碼等價的內容。看起來像: [ValidatingProperty] private int as int 而且會生成類似這樣的C#代碼: private int property; public int Property {get {return property; } set {Invalidate(); property = value;}} – Monoman 2010-08-11 18:29:06

回答

2

你基本上要求Aspect Oriented Programming(AOP)的一些版本。您希望跨所有屬性執行常見操作,而無需在每種情況下都執行該操作。

我不確定C#中AOP的真正選項是什麼,但我之前使用過的是Spring.Net AOP。它會做的是將你的類封裝在一個動態創建的包裝器中,它將攔截對你的屬性的所有調用,然後允許你實現一些通用的邏輯來執行。

+0

是的,它被稱爲TransparentProxy。 – Guge 2009-12-04 19:31:44

+0

感謝Chris,事實上,我使用的是NHibernate,所以再次包裝類是一個不錯的選擇,我敢肯定。你知道NHibernate是否有任何現有的事件可以連接到? – 2009-12-04 19:34:07

+0

我不知道是否提供了hook alreayd,但我不會認爲使用包裝會導致成本太高。因爲攔截器中的邏輯非常簡單,所以應該主要是每個屬性集上的額外函數調用的代價。 – 2009-12-04 19:39:50

3

不,這不是直接可能的語言。

但是,處理這種情況的一種方法是使用類似INotifyPropertyChanged的東西。如果你的基類指定它實現了這個接口,你的子類也應該引發PropertyChanged事件。基類可以使用它來跟蹤更改並驗證對象。

0

如果有問題的屬性是虛擬的,您可以重寫它們以提供通知並調用基類的實現以確保「set」通過。

0

在C#中沒有代碼的唯一方法是通過TransparentProxy。這有點麻煩,但它可以使編碼器看起來不可見。

0

那麼添加這個功能也許這個線程,你可以做的是建立在抽象類中的虛方法和屬性setter調用它。然後你可以在繼承的類中覆蓋它。

0

我碰到這個問題,所有的時間......所以我用這樣的模式:

public class Foo 
{ 
    public string Bar1 
    { 
     get{return this._Bar1;} 
     set{this.SafeSet(ref this._Bar1, value);} 
    }public string _Bar1; 

    public int Bar2 
    { 
     get{return this._Bar2;} 
     set{this.SafeSet(ref this._Bar2, value);} 
    }public int _Bar2; 

    protected virtual SafeSet<T> (ref T local, T val) 
    { 
     if(local != val) 
     { 
     local = val; 
     //whatever other post-processing you want 
     } 
    } 
}