C# 模式块将变量设置为开始值,做一些工作并用结束值重置变量

问题描述

我正在尝试优化以下工作流程:

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;
}