动态C#方法还是多If-else-If块?
在这种情况下,我需要验证WPF应用程序中是否选中了多个复选框,并相应地运行代码块。随着代码块的所有迭代,唯一改变的是文件名。示例代码如下所示动态C#方法还是多If-else-If块?,c#,wpf,C#,Wpf,在这种情况下,我需要验证WPF应用程序中是否选中了多个复选框,并相应地运行代码块。随着代码块的所有迭代,唯一改变的是文件名。示例代码如下所示 if(checkbox1.IsChecked == true) { Code(fileName1); } if(checkbox2.IsChecked == true) { Code(fileName2); } if(checkbox3.IsChecked == true) { Code(fileName3); } 这一切看起来
if(checkbox1.IsChecked == true)
{
Code(fileName1);
}
if(checkbox2.IsChecked == true)
{
Code(fileName2);
}
if(checkbox3.IsChecked == true)
{
Code(fileName3);
}
这一切看起来都是多余的。我无法创建方法并将文件名和复选框名传递给它,因为复选框将作为字符串传递,而IsChecked属性对于字符串无效。有什么方法可以克服这个问题并使代码看起来整洁吗?您可以将表单更改为使用
复选框的子类吗?如果是这样,您可以这样做:
class MyCheckBox : CheckBox
{
public string FileName { get; set; }
public void MyMethod()
{
if (IsChecked)
{
(do something with FileName);
}
}
}
然后在表单设计器中设置FileName
的值。最后,将问题中的代码替换为以下内容:
checkbox1.MyMethod();
checkbox2.MyMethod();
checkbox3.MyMethod();
能否将表单更改为使用复选框的子类?如果是这样,您可以这样做:
class MyCheckBox : CheckBox
{
public string FileName { get; set; }
public void MyMethod()
{
if (IsChecked)
{
(do something with FileName);
}
}
}
然后在表单设计器中设置FileName
的值。最后,将问题中的代码替换为以下内容:
checkbox1.MyMethod();
checkbox2.MyMethod();
checkbox3.MyMethod();
如果您必须以与现在相同的方式手动将复选框链接到字符串,并且只查找较短的代码,则可以将复选框包装到字典中,然后循环遍历它们:
var filesByCheckbox = new Dictionary<CheckBox, string> {
{ checkbox1, filename1 },
{ checkbox2, filename2 },
{ checkbox3, filename3 }
};
foreach (var kvp in filesByCheckbox)
{
if (kvp.Key.IsChecked)
{
Code(kvp.Value);
}
}
var filesByCheckbox=新建字典{
{checkbox1,filename1},
{checkbox2,filename2},
{checkbox3,filename3}
};
foreach(filesByCheckbox中的var kvp)
{
如果(kvp.Key.IsChecked)
{
代码(kvp.值);
}
}
这并没有真正改善任何东西,但它只是让它更清楚地显示哪个复选框附加到哪个文件,所以添加到列表中只需一行,而不是3行
如果Tanner的答案对您有效,我可能会同意。如果您必须以与现在相同的方式手动将复选框链接到字符串,并且只需要寻找较短的代码,您可以将复选框包装到字典中,然后循环:
var filesByCheckbox = new Dictionary<CheckBox, string> {
{ checkbox1, filename1 },
{ checkbox2, filename2 },
{ checkbox3, filename3 }
};
foreach (var kvp in filesByCheckbox)
{
if (kvp.Key.IsChecked)
{
Code(kvp.Value);
}
}
var filesByCheckbox=新建字典{
{checkbox1,filename1},
{checkbox2,filename2},
{checkbox3,filename3}
};
foreach(filesByCheckbox中的var kvp)
{
如果(kvp.Key.IsChecked)
{
代码(kvp.值);
}
}
这并没有真正改善任何东西,但它只是让它更清楚地显示哪个复选框附加到哪个文件,所以添加到列表中只需一行,而不是3行
如果Tanner的答案对您有效,我可能会同意。您需要以某种方式将复选框映射到文件名。一种简单的方法是使用标记属性:
checkbox1.Tag = filename1;
checkbox2.Tag = filename2;
checkbox3.Tag = filename3;
然后将yout复选框放入一个数组并处理:
var checkboxes = new [] { checkbox1, checkbox2, checkbox3 };
foreach (var checkbox in checkboxes.Where(cb => cb.IsChecked))
{
Code((string)checkbox.Tag);
}
您需要以某种方式将复选框映射到文件名。一种简单的方法是使用标记属性:
checkbox1.Tag = filename1;
checkbox2.Tag = filename2;
checkbox3.Tag = filename3;
然后将yout复选框放入一个数组并处理:
var checkboxes = new [] { checkbox1, checkbox2, checkbox3 };
foreach (var checkbox in checkboxes.Where(cb => cb.IsChecked))
{
Code((string)checkbox.Tag);
}
当你说something==true
时,它与something
相同。它通常使它更具可读性。但是,即使我将if(checkbox1.IsChecked==true)更改为if(checkbox1.IsChecked),它仍然会抛出相同的错误,不是吗?是的,它们是等价的语句,只是一个可读性问题。如果仍然会执行code(filename)
,只需使用逻辑更改文件名并避免编写“code”多次。当你说something==true
时,它与something
相同。它通常使它更具可读性。但是,即使我将if(checkbox1.IsChecked==true)更改为if(checkbox1.IsChecked),它仍然会抛出相同的错误,不是吗?是的,它们是等价的语句,只是可读性问题。如果仍将执行code(filename)
,只需使用逻辑更改文件名并避免多次编写“code”。看起来这样就可以了。我会尝试一下,然后向你汇报。我是C#的初学者,我试着从你提出的解决方案开始。我创建了一个新类CustomCheckBox,并使用CustomCheckBox:CheckBox从CheckBox继承。理想情况下,CustomCheckBox应该复制CheckBox的所有属性,不是吗?当我更新我的XAML并用CustomCheckBox替换CheckBox时,它抛出了一个错误,并表示WPF项目中不支持CustomCheckBox。为什么会发生这种情况?CheckBox和CustomCheckBox是相似的对象,对吗?不幸的是,我不熟悉WPF,所以我不知道答案。本页可能会帮助您:但是,使用Joe Enos的解决方案(或者您在实现Joe的解决方案时想到的想法——我认为这是一个好主意)可能会更容易。通过创建一个接受复选框作为参数的方法,实现了我的目标。谢谢你的时间。看起来这样就可以了。我会尝试一下,然后向你汇报。我是C#的初学者,我试着从你提出的解决方案开始。我创建了一个新类CustomCheckBox,并使用CustomCheckBox:CheckBox从CheckBox继承。理想情况下,CustomCheckBox应该复制CheckBox的所有属性,不是吗?当我更新我的XAML并用CustomCheckBox替换CheckBox时,它抛出了一个错误,并表示WPF项目中不支持CustomCheckBox。为什么会发生这种情况?CheckBox和CustomCheckBox是相似的对象,对吗?不幸的是,我不熟悉WPF,所以我不知道答案。本页可能会帮助您:但是,使用Joe Enos的解决方案(或者您在实现Joe的解决方案时想到的想法——我认为这是一个好主意)可能会更容易。通过创建一个接受复选框作为参数的方法,实现了我的目标。谢谢你的时间。当我实施你的解决方案时,我有了另一个想法。为什么不创建一个执行所有活动的方法,并将CheckBox类型的对象作为参数传递给该方法?这很有道理。不是吗?当我实施你的解决方案时,我有了另一个想法。为什么不创建一个执行所有活动的方法,并将CheckBox类型的对象作为参数传递给该方法?这很有道理。不是吗?