[英]Dynamic C# Method or multiple If-else-if blocks?
我有一种情况,我需要验证是否在WPF应用程序中选中了多个复选框,并相应地运行代码块。 在代码块的所有迭代中唯一更改的是文件名。 示例代码如下所示
if(checkbox1.IsChecked == true)
{
Code(fileName1);
}
if(checkbox2.IsChecked == true)
{
Code(fileName2);
}
if(checkbox3.IsChecked == true)
{
Code(fileName3);
}
这一切看起来都是多余的。 而且我无法创建方法并将文件名和checkBox名称传递给它,因为checkBox将作为字符串传递,而IsChecked属性对于字符串无效。 有什么办法可以克服这个问题并使代码看起来更整洁?
如果您必须像现在一样手动将复选框链接到字符串,并且只是在寻找较短的代码,则可以将复选框包装成字典,然后遍历它们:
var filesByCheckbox = new Dictionary<CheckBox, string> {
{ checkbox1, filename1 },
{ checkbox2, filename2 },
{ checkbox3, filename3 }
};
foreach (var kvp in filesByCheckbox)
{
if (kvp.Key.IsChecked)
{
Code(kvp.Value);
}
}
这并不能真正改善任何情况,但是只是使哪个复选框附加到哪个文件上更加清晰,因此添加到列表中仅一行而不是3。
如果它对您有用,我可能会选择坦纳的答案。
您可以更改表单以使用CheckBox
的子类吗? 如果是这样,您可以这样做:
class MyCheckBox : CheckBox
{
public string FileName { get; set; }
public void MyMethod()
{
if (IsChecked)
{
(do something with FileName);
}
}
}
然后在窗体设计器中设置FileName
的值。 最后,将您问题中的代码替换为如下代码:
checkbox1.MyMethod();
checkbox2.MyMethod();
checkbox3.MyMethod();
您需要以某种方式将复选框映射到文件名。 一种简单的方法是使用Tag属性:
checkbox1.Tag = filename1;
checkbox2.Tag = filename2;
checkbox3.Tag = filename3;
然后将您的复选框放入数组并进行以下处理:
var checkboxes = new [] { checkbox1, checkbox2, checkbox3 };
foreach (var checkbox in checkboxes.Where(cb => cb.IsChecked))
{
Code((string)checkbox.Tag);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.