我曾在此基礎大多Vlad的建議了一下。原來你可以用一個泛型類來抽象這個。下面是最終的結果:
public class Overridable<T>
{
private Func<T> _calculate;
private readonly Func<T, T, bool> _compare;
protected T _t;
public Overridable(Func<T> calculate, Func<T, T, bool> compare)
{
_calculate = calculate;
_compare = compare;
}
public T Value
{
get { return _compare(_t, default(T)) ? _calculate() : _t; }
set { _t = _compare(value, _calculate()) ? default(T) : value; }
}
}
你需要在一個比較委託,直到你在子類中設置爲通過,因爲該類型是不知道。所以一個簡單的==
不會削減它。我走了簡單的路線,並使用了Func委託,但如果由於某種原因必須適應.NET 2.0,則可以使用普通委託來替換它。
您會注意到我使用的是default(T)
而不是null
。這是有效的,因爲Nullable<T>
的默認值是null
(或者更確切地說,未定義,但它看起來是相同的)。
這並不妨礙您嘗試爲非空類型聲明Overridable<T>
。你最終得到的結果將不會通過運行時錯誤,但它不是有用的。試圖設置一個Overridable<decimal>.Value
到null
會給你一個編譯器錯誤。將其設置爲default(decimal)
將導致它恢復爲計算該值。
我走了這條路線,因爲我使用這個類的屬性需要填充一個可序列化的對象,它最終以xml的形式傳輸。 xml的模式包括定義爲整數,小數和字符串混合的數字字段。
然後,您使用Overriddable類,像這樣:
private Overridable<decimal?> _excessWages =
new Overridable<decimal?>(CalculateExcessWages, (x,y) => x == y);
public virtual decimal? ExcessWages
{
get
{
return _excessWages.Value;
}
set
{
_excessWages.Value = value;
}
}
我遇到了這個唯一的問題是,CalculateExcessWages
是一個非靜態方法,因此不能在現場初始使用。由於我的類中的所有屬性都是非靜態的,因此我必須初始化構造函數中的所有支持字段。
你究竟在問什麼?我發現這個屬性被聲明爲'virtual',但是從文本中我知道你更關心setter中的代碼構造了嗎? – 2010-02-26 16:14:36
對不起。我刪除了虛擬。這不是我所感興趣的,我關心的是從最終用戶的角度來看'可重複'。 – 2010-02-26 16:16:41