问题描述
我正在尝试优化以下工作流程:
myObj.SupressEvents = true;
DoSomeWork();
DoSomeMoreWork();
...
myObj.SupressEvents = false;
这个问题很明显,要么 myObj.SupressEvents = true/false;
可能被遗漏并导致不必要的错误,或者只是通过使用返回可以使重置为 false 永远无法到达,我正在寻找一种模式避免忘记它,例如:
// This is a keyword example,not a function call nor deFinition
SetAndReset(myObj.SupressEvents,true,false)
{
DoSomeWork();
DoSomeMoreWork();
...
}
我想这可以通过委托或带有 Func 的函数来完成,但是即使我在两者之间进行返回,它仍然可以将变量重置为 false 吗? 原生 C# 关键字中有类似的东西吗?
解决方法
您可以声明一个接受 Action
(您想要做的工作)的方法并将调用包装在该方法中:
void Wrap(Action action,object myObj /* Replace with actual type,or remove parameter if field in class */)
{
myObj.SupressEvents = true;
action.Invoke();
myObj.SupressEvents = false;
}
您可以像这样调用该方法:
Wrap(() =>
{
DoSomeWork();
DoSomeMoreWork();
});
,
作为对@Hayden 解决方案的改进,我喜欢发布一个防弹版本,该版本还处理可能发生的异常并破坏变量状态:
public void SuppressRebuildPropertiesWork(Action action)
{
SuppressRebuildPropertiesWork(() =>
{
action.Invoke();
return true;
});
}
public bool SuppressRebuildPropertiesWork(Func<bool> action)
{
bool result;
try
{
SuppressRebuildProperties = true;
result = action.Invoke();
}
catch (Exception e)
{
Debug.WriteLine(e);
throw;
}
finally
{
SuppressRebuildProperties = false;
}
return result;
}