【发布时间】:2014-09-04 20:34:15
【问题描述】:
我正在寻找一种机制,它允许我仅在满足某些条件时才推迟设置参数的支持字段。在遇到障碍之前,我一直在考虑这个设计,因为它需要在 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 = valueaction lambda吗? -
不在 setValue() 内部,因为它特定于 _setPoint,而我想使用 setValue 的原因是因为这是一个抽象类,所以我想将属性设置器内部的实现保持在最小限度。 SetPoint 只是一个示例,在派生类中定义的更多道具应该以相同的方式处理。