创建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];
?
在定义字典本身之前,不能为字典中的每个项定义方法的参数。在构造字典的每个值时,需要声明形参的标识符:
private Dictionary<TabPage, Func<FileStream, DataGridView>> WriteTextFileByTab
= new Dictionary<TabPage, Func<FileStream, DataGridView>>()
{
{findScriptsTab, fs => WriteTextFile(fs, findScriptsDataGrid)}
};
当然,如果findScriptsTab
和findScriptsDataGrid
是实例字段,正如我怀疑的那样,您将无法在初始化另一个实例字段时使用它们。因此,您需要在构造函数中初始化这个字典,而不是在声明它的时候。
看起来字典中的委托(基于WriteTextFile
的实现)实际上不需要返回DataGridView
,因此要使用的适当委托实际上是Action<FileStream>
,而不是Func<FileStream, DataGridView>
。