在这种情况下使用委托是否明智?

本文关键字:是否 这种情况下 | 更新日期: 2023-09-27 18:11:11

我知道委托已经在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和其他代码。我的愿景将是这样的…

      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,但它似乎想要一个返回类型,我的方法不返回任何东西,所以我已经转移到委托。

谁能帮我转换我的例子?

在这种情况下使用委托是否明智?

如果是我,我会想出一个包含界面的漂亮的解决方案。我建议你研究一下这种方法。但如果不知道你想要做什么,那么这样做是没有意义的。

所以这是我尝试用我得到的工作。

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);
    }
}

尝试使用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);
  }
}