类中取消方法的模式

时间:2017-01-13 12:00:39

标签: c# events

public class Foo : Collection<string>
{
  bool _cancel = false;
  public void AddWithoutDoingStuff(string item)
  {
    _cancel = true;
    Add(item);
    _cancel = false;
  }
  protected override void InsertItem(int index, string item)
  {
    base.InsertItem(index, item);
    if (!_cancel)
    {
      //Do some stuff
    }
  }
}

我想知道是否有一种模式可以避免这个丑陋的_cancel成员?我发现了一些东西: Temporarily stop form events from either being raised or being handled? 但这仅适用于事件。

修改 对不起,我没有表达自己。这只是一个例子。显式基类无关紧要。我想要的是在这种情况下避免_cancel变量的一般解决方案。我不喜欢AddWithoutDoingStuff方法,就像在这个例子中一样。如果出现错误,则无法保存,因此我必须执行以下操作:

try
{
  _cancel = true;
  Add(item);
}
finally
{
  _cancel = false;
}

这也不是威胁保存。

2 个答案:

答案 0 :(得分:1)

您无法覆盖Add方法的工作方式。它只需调用InsertItem而无需任何其他参数。这意味着在InserItem中添加一些额外参数的唯一方法是通过类字段(您的解决方案)传递它们。

但如果您不打算调用基础Add方法,您可以控制在插入项目之前/之后完成或未完成的操作

public class Foo : Collection<string>
{
    public void AddWithoutDoingStuff(string item)
    {
        if (Items.IsReadOnly())
           throw new NotSupportedException();

        base.InsertItem(Count, item);
    }

    protected override void InsertItem(int index, string item)
    {
        base.InsertItem(index, item);
        // Do Some Stuff
    }
}

注意:不幸的是检查内部项是否在Add基础calss方法中完成。并且InsertItem方法中没有验证。所以如果你做同样的检查会很好。

答案 1 :(得分:0)

您的Collection object不需要,也不应该_cancel bool,,因为我们正在谈论表格。

如果你使用Forms表示WinForms,并且我们在event驱动这里我假设你这样做,那么处理这个问题的正确方法是从UI或调用中检索任何取消作为参数方法并在调用集合之前解决它。最好不要执行一个进程而不是执行一个进程并取消它。示例(在代码中进一步假设未声明的变量):

DialogResult dr = MessageBox.Show("Do this?", "Question", MessageButton.OKCancel);
myFoo.InsertItem(myIndex, myItem, (r != DialogResult.Cancel ? true : false);

当然,您稍微修改了InsertItem方法:

  protected void InsertItem(int index, string item, bool _cancel)
  {
    base.InsertItem(index, item);
    if (!_cancel)
    {
      //Do some stuff
    }
  }

它不一定是MessageBox。我只是用它来说明管理你的切换的正确方法,而没有你班上那个丑陋的_cancel字段。

另外,根据我现在提出的其中一条评论的主题,你应该有一个集合作为课程的一部分,而不是继承自Collection。