我正在寻找一种机制,只有在满足某些条件时才允许延迟参数的后台字段的设置。我一直认为这个设计直到我遇到困难,因为它需要在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