Thank you everyone.. with your input I came up with this
public class MyStack
{
public IDisposable Transaction()
{
return new UndoStackTransaction(this);
}
public void BeginCommit()
{
}
public void EndCommit()
{
}
public class UndoStackTransaction : IDisposable
{
private MyStack _myStack;
public UndoStackTransaction(MyStack undoStack)
{
_myStack = undoStack;
_myStack.BeginCommit();
}
~UndoStackTransaction() => Dispose(false);
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
_myStack.EndCommit();
}
}
}
Which allows me to do this....
using (var transaction = stack.Transaction())
{
//Do Something
}