动态C#方法还是多个If-else-if块?

时间:2016-09-16 21:05:11

标签: c# wpf

我有一种情况需要验证是否在WPF应用程序中选中了多个复选框并相应地运行代码块。对代码块的所有迭代而言,唯一改变的是文件名。示例代码如下所示

if(checkbox1.IsChecked == true)
{
    Code(fileName1);
}
if(checkbox2.IsChecked == true)
{
    Code(fileName2);
}
if(checkbox3.IsChecked == true)
{
    Code(fileName3);
} 

这看起来多余。并且我无法创建方法并将文件名和checkBox名称传递给它,因为checkBox将作为字符串传递,并且IsChecked属性对于字符串将无效。有什么方法可以克服这个问题并使代码看起来整洁?

3 个答案:

答案 0 :(得分:3)

如果您必须以与现在相同的方式手动将复选框链接到字符串,并且只是寻找更短的代码,您可以将复选框包装到字典中,然后循环遍历它们:

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。

如果适合你,我可能会选择坦纳的答案。

答案 1 :(得分:1)

您可以更改表单以使用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();

答案 2 :(得分:1)

您需要以某种方式将复选框映射到文件名。一种简单的方法是使用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);
}