创建Func的字典

本文关键字:字典 Func 创建 | 更新日期: 2023-09-27 18:11:55

我有一个方法将DataGridView写入文本文件:

private void textToolStripMenuItem_Click(object sender, EventArgs e)
{
  SaveFileDialog saveFileDialog1 = new SaveFileDialog();
  saveFileDialog1.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
  saveFileDialog1.FilterIndex = 2;
  saveFileDialog1.RestoreDirectory = true;
  saveFileDialog1.FileName = DateTime.Now.ToString("yyyyMMddhhmm") + "_icmquery_" + GetTabName() + ".txt";
  if (saveFileDialog1.ShowDialog() == DialogResult.OK)
  { 
    using (FileStream fs = new FileStream(saveFileDialog1.FileName, FileMode.OpenOrCreate))
    {
      switch (mainTabGroup.SelectedTab.Name.ToString())
      {
        case "findScriptsTab":
          WriteTextFile(fs, findScriptsDataGrid);
          break;
        case "dialNumberAuditTab":
          WriteTextFile(fs, findScriptsDataGrid);
          break;
        case "calltypeRequalificationTab":
          WriteTextFile(fs, ctrDataGrid);
          break;
        case "targetAuditTab":
          WriteTextFile(fs, targetAuditDataGrid);
          break;
      }
    }
  }
}
public void WriteTextFile(FileStream fs, DataGridView dataGrid)
{
  using (TextWriter tw = new StreamWriter(fs))
  {
    foreach (DataGridViewRow row in dataGrid.Rows)
    {
      string line = string.Empty;
      foreach (DataGridViewCell cell in row.Cells)
      {
        line = line + cell.Value + ",";
      }
      line = line.TrimEnd(',');
      tw.WriteLine(line);
    }
  }
}

但是,我想在我的形式中定义一个字典,而不是在textToolStripMenuItem_Click()中使用大开关语句。我试过了:

private Dictionary<TabPage, Func<FileStream, DataGridView>> WriteTextFileByTab(FileStream fs) = new Dictionary<TabPage, Func<FileStream, DataGridView>>()
{
  {findScriptsTab, WriteTextFile(fs, findScriptsDataGrid)}
};

但视觉工作室甚至不会将其注册为有效的东西。我手动输入了这个,但是没有任何东西能填进去。当我悬停在"findScriptsTab"上时,它说它是一个像类型一样使用的字段,而WriteTextFile也说同样的事情。关于如何正确地将switch语句转换为字典的任何想法,所以我可以说:WriteTextFileByTab[mainTabGroup.SelectedTab]; ?

创建Func的字典

在定义字典本身之前,不能为字典中的每个项定义方法的参数。在构造字典的每个值时,需要声明形参的标识符:

private Dictionary<TabPage, Func<FileStream, DataGridView>> WriteTextFileByTab 
    = new Dictionary<TabPage, Func<FileStream, DataGridView>>()
{
    {findScriptsTab, fs =>  WriteTextFile(fs, findScriptsDataGrid)}
};

当然,如果findScriptsTabfindScriptsDataGrid是实例字段,正如我怀疑的那样,您将无法在初始化另一个实例字段时使用它们。因此,您需要在构造函数中初始化这个字典,而不是在声明它的时候。

看起来字典中的委托(基于WriteTextFile的实现)实际上不需要返回DataGridView,因此要使用的适当委托实际上是Action<FileStream>,而不是Func<FileStream, DataGridView>