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

时间:2013-04-29 00:58:12

标签: c# winforms delegates

我知道代表们已经在SO上做了很多,但有时它不会点击,直到我在自己的东西上看到它。我查看以下表单代码,我知道它可以更好。

应该注意的是,我正在使用包含我想要使用的方法的“模型类”'_model'。

  1. _model.LoadItemType1接受一个字符串,但不返回值(加载文本和构建对象)。
  2. _model.LoadTotallyDifferentItem也接受一个字符串但构建不同的对象。
    (这两种方法都有一个不带参数的重载 - 这会使事情变得复杂吗?)
  3. ... ...

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

    任何人都可以帮我转换我的例子吗?

2 个答案:

答案 0 :(得分: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);
    }
}

答案 1 :(得分: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);
  }
}