メソッドを次々に自動的に呼び出すよりクリーンな方法は?

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

私が探しているのは、呼び出された場所に関係なく、次のメソッドに自動的に連鎖させるためにメソッドに適用できるある種の署名だと思います。 e.g

(これは構文的に正しくないことを知っています。)

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

メソッドに含まれるロジックからメソッドのインターフェイスを分離したい。 それ以上ではないにしても、それは正確な努力量だと理解しています。 たとえば、メソッドを編集して_accidently__ Refreshを削除すると、アプリケーションが破損します。 一方、Refreshメソッドがメソッドの実際のロジックの外側にある場合、ロジックの次のチェーンを削除することを心配せずにメソッド内で何でもできます。

  5  0


ベストアンサー

あなたが望むものはアスペクト指向プログラミングであるように聞こえます、いくつかのメソッドセットが実行された後に「魔法のように」物事を発生させることができる多くの異なるフレームワークがあります。https://stackoverflow.com/questions/2031845 /aop-programming-in-net[.NetでのAOPプログラミング?]

4


私は本当にきれいな方法を知りません。 1つの方法は、http://www.sharpcrafters.com/postsharp/documentation/getting-started [PostSharp]を使用することです。

1


フォームをリフレッシュしてフォームレベルのプロパティに変更する変更をカプセル化できます。

例えば、

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

それからあなたのイベントは

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

もちろん、フォームを更新する必要がある同じ変数を操作する複数のイベントがある場合にのみ、コードをクリーンアップします。

0


特定の問題と投稿されたソリューションを考慮すると、ここでの「最もクリーンな」アプローチは、http://msdn.microsoft.com/en-us/library/ms743695.aspx [Property Changed Notification]を実装することですフォームでの内部使用 MSDNの例のようにイベントを公開する必要はありません。

これにより、フォームの更新が必要になることがわかっているプロパティの内部リストを維持できます。

  private List _refreshProps = new List();
  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`メソッドで再度処理できることです。

0


「リフレッシュ」を呼び出さないで、「無効」を呼び出します。 必要なメカニズムは既にWindowsに組み込まれています。 「Invalidate」を呼び出すと、ウィンドウの再描画が必要であるというメモが作成されます。 オペレーティングシステムは最終的にWM_PAINTメッセージをポストします(通常は、ルートのDispatchMessage呼び出しが終了した後ですが、正確な実装は無関係です)。

0


セッターでRefreshを呼び出すプロパティを使用します。

-1


このようなもの:

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; });
    }
  • UPDATE-投票者へのメッセージ:*

あなたの何人かが盲目すぎて見ることができないのは、これがすべてとそれほど違いがないということです:

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

それがより単純であり、ソリューションに別のフレームワークを追加する必要がないことを除いて。 それでもなお、他の答えは、あまり投票されないことを示唆しています!

あなたたちの何が問題なのですか?

-5


タイトルとURLをコピーしました