繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM