我知道代表们已经在SO上做了很多,但有时它不会点击,直到我在自己的东西上看到它。我查看以下表单代码,我知道它可以更好。
应该注意的是,我正在使用包含我想要使用的方法的“模型类”'_model'。
... ...
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,但它似乎想要一个返回类型,我的方法不返回任何东西,所以我已经转移到代表。
任何人都可以帮我转换我的例子吗?
答案 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);
}
}