一种自动调用一种方法的清洁方法?

时间:2011-01-28 15:08:08

标签: c# winforms

是否有可能以这种方式设计方法,它知道它必须在退出时自动连续调用下一个方法?

在下面的示例中,我必须调用Refresh()以使我的表单在此事件发生后重新绘制。问题是,在例如必须使表单刷新的20个不同事件之后调用Refresh()是很难看的。 e.g

private void PriorityLine_Click(object sender, EventArgs e)
{
   _showPriorityLine = (_showPriorityLine) ? false : true;
  Refresh(); // Must call refresh for changes to take effect.
}

我想我正在寻找的是某种签名,我可以应用于该方法,使其自动链接到下一个方法,无论从哪里调用。例如

(我知道这在语法上不正确。)

private void PriorityLine_Click(object sender, EventArgs e).Refresh()
{
   _showPriorityLine = (_showPriorityLine) ? false : true;
}

我想从方法中包含的逻辑中分离方法的接口。我知道这将是确切的努力量,如果不是更多。例如,如果我要编辑该方法并且意外地删除了Refresh,则会导致我的应用程序中断。然而,如果Refresh方法超出了方法的实际逻辑,我可以在方法中做任何事情而不用担心删除下一个逻辑链。

7 个答案:

答案 0 :(得分:4)

听起来你想要的是面向方面编程,有一些不同的框架可以让你在运行一些方法之后“神奇地”发生东西,看看这里AOP programming in .Net?

答案 1 :(得分:1)

我不知道任何真正干净的方式。一种方法是使用PostSharp

答案 2 :(得分:0)

您可以封装更改,这些更改会导致表单刷新为表单级属性。

例如,

private bool _showPriorityLine;
private bool ShowPriorityLine
{
    get { return _showPriorityLine; }
    set
    {
        _showPriorityLine = value;
        Refresh();
    }
}

那么你的活动就是

private void PriorityLine_Click(object sender, EventArgs e)
{
    ShowPriorityLine = !ShowPriorityLine;
}

当然,如果您有多个事件操纵导致表单需要刷新的相同变量,那么这只会清理您的代码。

答案 3 :(得分:0)

考虑到您的特定问题和发布的解决方案,我会说这里“最干净”的方法是在表单中实现Property Changed Notification仅供内部使用,即您不需要公开事件就像在MSDN示例中一样。

通过这种方式,您可以维护一个内部的属性列表,您知道这些属性需要刷新表单,例如

  private List<string> _refreshProps = new List<string>();
  private bool _showPriority;

  public void Form()
  {
      _refreshProps.Add("ShowPriority");
      ... etc
  }

  // only implement properties like this that need some extra work done
  public bool ShowPriority
  {
      get { return _showPriority; }
      set
      {
          if (_showPriority != value)
          {
              _showPriority = value;
              // Call OnPropertyChanged whenever the property is updated
              OnPropertyChanged("ShowPriority");
          }
      }
  }

  // basic property that doesn't require anything extra
  public bool AnotherProperty { get; set; }

  public void Refresh()
  {
      // refresh the form
  }

  protected void OnPropertyChanged(string name)
  {
      if (_refreshProps.Contains(name))
          Refresh();
  }

这种方法的好处是,如果将来您需要在特定属性之后执行其他“stuff”,您可以简单地引入另一个列表并在OnPropertyChanged方法中再次处理它。

答案 4 :(得分:0)

请勿致电Refresh,致电Invalidate。您需要的机制已内置到Windows中。调用Invalidate只是说明窗口需要重新绘制。操作系统最终会发布WM_PAINT消息(通常在根DispatchMessage调用完成后,但确切的实现是无关紧要的。)

答案 5 :(得分:-1)

使用在setter中调用Refresh的属性。

答案 6 :(得分:-5)

这样的事情:

private void RefreshAfter(Action action)
    {
        action();
        Refresh();
    }

更新以使其更加显着:

    private void DoSomeUiShiznit(Action action)
    {
        action();
        // other parts of the code don't realize that Refresh has to be called.
        // But that's cool. I got it covered.
        Refresh();
    }

    private void PriorityLine_Click(object sender, EventArgs e)
    {
        DoSomeUiShiznit(() => { _showPriorityLine = !_showPriorityLine; });
    }

更新 - 向下选民发送消息:

你们中有些人太盲目无法看到,这与以下内容并无不同:

[SomeRefreshAttribute]  
private void PriorityLine_Click(object sender, EventArgs e)  
{
    _showPriorityLine = !_showPriorityLine;  
}  

除了它更简单,并且不需要在解决方案中添加另一个框架。然而另一个答案表明,不要再投票了!

你们有什么问题?