在这种情况下使用委托是否明智?
本文关键字:是否 这种情况下 | 更新日期: 2023-09-27 18:11:11
我知道委托已经在SO上做了很多,但有时它不点击,直到我看到我自己的东西。我看了下面的表单代码,我知道可以做得更好。
应该注意的是,我正在使用一个包含我想要使用的方法的"模型类"'_model'。
- _model。LoadItemType1接受字符串,但不返回值(加载文本并构建对象)。
- _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,但它似乎想要一个返回类型,我的方法不返回任何东西,所以我已经转移到委托。
谁能帮我转换我的例子?
如果是我,我会想出一个包含界面的漂亮的解决方案。我建议你研究一下这种方法。但如果不知道你想要做什么,那么这样做是没有意义的。
所以这是我尝试用我得到的工作。
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);
}
}
尝试使用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);
}
}