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 和其他代码的方法。我的愿景会是这样的......

      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 回答