0

デリゲートが SO で多くのことを行ってきたことは知っていますが、自分のものを見るまでクリックしないことがあります。次のフォーム コードを見て、改善できることがわかりました。

使用したいメソッドを含む「モデルクラス」「_model」を使用していることに注意してください。

  1. _model.LoadItemType1 は文字列を受け取りますが、値を返しません (テキストを読み込んでオブジェクトを構築します)。
  2. _model.LoadTotallyDifferentItem も文字列を取りますが、異なるオブジェクトを構築します。
    (どちらのメソッドにも、パラメーターを取らないオーバーロードがあります。これは複雑なことですか?)

... ... ...

      private string Item1;
      private string Item2;

      private void button1Click(object sender, EventArgs e)
      {
        OpenFileDialog OFD = new OpenFileDialog();
        if (OFD.ShowDialog() == DialogResult.OK)
           {
           // Removed TRY-CATCH block for simplicity
           Item1= OFD.FileName;
           _model.LoadItemType1(Item1);
           }
        //Some other code to update form etc.
        }

    private void button2Click(object sender, EventArgs e)
    {
        OpenFileDialog OFD = new OpenFileDialog();
        if (OFD.ShowDialog() == DialogResult.OK)
        {
           // Removed TRY-CATCH block for simplicity
           Item2 = OFD.FileName;
           _model.LoadTotallyDifferentItem(Item2 );
        }
        //Some other code to update form etc.
     }  

それらの周りのものはすべて似ています. 私は、実行中のメソッドを単純に渡すもの、つまり _model.LoadItemType1 を使用して、try-catch およびその他のコードを実行する 1 つのメソッドを使用できるはずだと考えました。私のビジョンはこのようになります...

      string Item1;
      string Item2;
   private void DoThis( /* take my Method namne here */, ref string s )
   {
          // all the code from above but with the appropriate method and string reference
   }

   private void button1Click(object sender, EventArgs e)
   {
         DoThis(_model.LoadItemType1, ref Item1);
   }

   private void button2Click(object sender, EventArgs e)
   {
         DoThis(_model.LoadTotallyDifferentItem, ref Item2);
   }

これにより、ファイル タイプを読み込むボタンを追加でき、大量のコードをコピーする必要がなくなりました。

SO で多くの例を試しましたが、それらを実装しようとすると常につまずくようです。また、少し混乱して、さまざまな概念を混ぜようとします。Func を渡そうとしましたが、戻り値の型が必要なようで、メソッドが何も返さないため、デリゲートに移動しました。

私の例を変換するのを手伝ってくれる人はいますか?

4

2 に答える 2

1

私だったら、インターフェースを使った素敵なソリューションを思いつくでしょう。そのような方法を検討することをお勧めします。しかし、ここで何をしようとしているのかを正確に知らなければ、それを行う意味がないかもしれません。

だからここに私が得たものを使って作業する私の試みがあります.

string Item1;
string Item2;
private string GetFileName()
{

    var returnValue = (string)null;
    OpenFileDialog OFD = new OpenFileDialog();
    if (OFD.ShowDialog() == DialogResult.OK)
    {
       // Removed TRY-CATCH block for simplicity
       returnValue = OFD.FileName;
    }

    return returnValue;
}

private void button1Click(object sender, EventArgs e)
{
    Item1 = GetFileName();

    if (!string.IsNullOrWhiteSpace(Item1)){
         _model.LoadItemType1(Item1);
    }
}

private void button2Click(object sender, EventArgs e)
{
     Item2 = GetFileName();

    if (!string.IsNullOrWhiteSpace(Item2)){
         _model.LoadTotallyDifferentItem(Item2);
    }
}
于 2013-04-29T01:22:16.557 に答える
0

使ってみてAction<String>

private void DoThis( Action<String> action, ref string s )
{
  // all the code from above but with the appropriate method and string reference
  OpenFileDialog OFD = new OpenFileDialog();
  if (OFD.ShowDialog() == DialogResult.OK)
  {
    // Removed TRY-CATCH block for simplicity
    s = OFD.FileName;
    action(s);
  }
}
于 2013-04-29T01:17:34.960 に答える