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

C# pattern block to set a variable to a begin value, do some work and reset variable with a end value

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

myObj.SupressEvents = true;
DoSomeWork();
DoSomeMoreWork();
...
myObj.SupressEvents = false;

这个问题很明显,两者之间可能会遗漏 myObj.SupressEvents = true/false; 并导致不必要的错误,或者只是使用 return 可以使重置为 false 永远无法达到,我我正在寻找一种避免忘记它的模式,例如:

// This is a keyword example, not a function call nor definition
SetAndReset(myObj.SupressEvents, true, false)
{
   DoSomeWork();
   DoSomeMoreWork();
   ...
}

我想这可以通过委托或带有 Func 的函数来完成,但是即使我在两者之间执行 return 它也能正常工作吗,无论如何它都会将变量重置为 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 解决方案的改进,我喜欢 post 防弹版本,它还处理可能发生的异常并破坏变量的状态:

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