我正在尋找一種機制,只有在滿足某些條件時才允許延遲參數的後臺字段的設置。我一直認爲這個設計直到我遇到困難,因爲它需要在lambda表達式中使用ref
參數。有沒有辦法做到這一點,而無需將ref參數放入lambda?如何在以後設置屬性值
protected bool isRunning = false;
List<Action> argumentSetters = new List<Action>();
// the reason for the delegate and following subroutine
// is to define an action which takes a ref parameter
protected delegate void setArgByRef<T>(ref T arg, T value);
protected void setArgByRefSub<T>(ref T arg, T value)
{
arg = value;
}
protected int _setPoint;
public int SetPoint
{
get { return _setPoint; }
set { setValue(ref _setPoint, value); }
}
public void Run()
{
isRunning = true;
// time consuming code here
// don't want SetPoint to be allowed to change
// while isRunning == true
isRunning = false;
// set SetPoint and other properties after
argumentSetters.ForEach((a) => a.Invoke());
}
protected void setValue<T>(ref T arg, T value)
{
setArgByRef<T> a = new setArgByRef<T>(setArgByRefSub<T>);
if (isRunning)
// cannot use ref parameter inside a lambda
{ argumentSetters.Add(() => a.Invoke(ref arg, value)); }
else
{ arg = value; }
}
你可以使用'()=> _setPoint = value'動作lambda嗎? – 2014-09-04 20:36:49
不在setValue()內,因爲這是特定於_setPoint,我想使用setValue的原因是因爲這是一個抽象類,所以我想保持屬性setter中的實現最小化。 SetPoint僅僅是一個例子,在派生類中定義了更多的道具,這些道具應該以相同的方式處理。 – djv 2014-09-04 20:38:47