C# 如何缩减代码

Dear200892 2020-07-08 10:02:05
有一个类SelectPrintType,绑定界面有哪些CheckBox是被选中的。

但是这个类的有参构造函数实在是太长了!!!

我想缩减这个实例化代码,就是想偷懒,免得以后加复选框又要改函数。




有什么好的建议吗?
...全文
251 点赞 收藏 19
写回复
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
引用 9 楼 Dear200892 的回复:
[quote=引用 5 楼 杀马特丶蛮牛 的回复:]弄个类,以后要加也就加一个属性的事
那赋值块怎么缩减呢?[/quote]

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        public Form1(SelectedValues selectedValues) : this()
        {
            this.cb_test.Checked = selectedValues.isTest;
            foreach (Control c in this.Controls)
            {
                if (c is CheckBox checkBox)
                {
                    foreach (var prop in typeof(SelectedValues).GetProperties())
                    {
                        if (checkBox.Name == "cb_" + prop.Name)
                        {
                            checkBox.Checked = (bool)prop.GetValue(selectedValues);
                            break;
                        }
                    }
                }
            }
        }
    }

    public class SelectedValues
    {
        public bool isTest { get; set; } = false;
    }

回复
Bridge_go 2020-07-08
如果我写,我喜欢用枚举

public enum CKName_e
{
    GuidelinesSingle,
    FunctionCheck,
    Test,
    Breakfast,
}

public class SelectPrintType
{
    public SelectPrintType(Dictionary<CKName_e, bool> dictCkChecked)
    {
        this._dictCkChecked = dictCkChecked;
    }

    Dictionary<CKName_e, bool> _dictCkChecked = new Dictionary<CKName_e, bool>();
}
窗体里面:
Dictionary<CKName_e, bool> _dictCkChecked = new Dictionary<CKName_e, bool>();
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
    CheckBox ck = sender as CheckBox;
    string enumName = ck.Name.Substring(3);
    CKName_e cKName;
    if (Enum.TryParse(enumName, out cKName))
    {
        _dictCkChecked[cKName] = ck.Checked;
    }
}
回复
Bridge_go 2020-07-08
引用 15 楼 Dear200892 的回复:
[quote=引用 14 楼 Bridge_go 的回复:] 你这不是一一对应的么,你把类里面的哪些参数也用同一个类型啊 public SelectPrintType(var class) { this._class=class; }
SelectPrintType是存放复选框的选中状态,这个class我没看明白。[/quote] 没看到你第一张图片
回复
Dear200892 2020-07-08
引用 14 楼 Bridge_go 的回复:
你这不是一一对应的么,你把类里面的哪些参数也用同一个类型啊 public SelectPrintType(var class) { this._class=class; }
SelectPrintType是存放复选框的选中状态,这个class我没看明白。
回复
Bridge_go 2020-07-08
引用 7 楼 Dear200892 的回复:
[quote=引用 3 楼 Bridge_go 的回复:]这种不应该定义一个对象么
参数变少了。 但是里面的赋值并没有感觉到什么大变化。[/quote] 你这不是一一对应的么,你把类里面的哪些参数也用同一个类型啊 public SelectPrintType(var class) { this._class=class; }
回复
正怒月神 2020-07-08
引用 12 楼 Dear200892 的回复:
[quote=引用 10 楼 正怒月神 的回复:]参数默认值
如果加一个复选框,这默认值也还是要加[/quote] 我不明白,那你加了复选框,难道还想不加参数吗? 那么你传入list<复选框>
回复
Dear200892 2020-07-08
引用 10 楼 正怒月神 的回复:
参数默认值
如果加一个复选框,这默认值也还是要加
回复
Dear200892 2020-07-08
引用 6 楼 贵阳老马马善福专业维修游泳池堵漏防水工程 的回复:
可以使用默认参数+命名参数 https://www.cnblogs.com/myfqm/articles/12986442.html
如果有一个值是默认值相反数,应该要全填吧。
回复
正怒月神 2020-07-08
参数默认值
回复
Dear200892 2020-07-08
引用 5 楼 杀马特丶蛮牛 的回复:
弄个类,以后要加也就加一个属性的事
那赋值块怎么缩减呢?
回复
Dear200892 2020-07-08
引用 4 楼 蜗牛慢慢趴 的回复:
传个结构体进来
赋值怎么改?
回复
Dear200892 2020-07-08
引用 3 楼 Bridge_go 的回复:
这种不应该定义一个对象么
参数变少了。 但是里面的赋值并没有感觉到什么大变化。
回复
可以使用默认参数+命名参数
https://www.cnblogs.com/myfqm/articles/12986442.html
回复
弄个类,以后要加也就加一个属性的事
回复
蜗牛慢慢趴 2020-07-08
传个结构体进来
回复
Bridge_go 2020-07-08
这种不应该定义一个对象么
回复
Dear200892 2020-07-08
引用 1 楼 csdnFUCKINGSUCKS 的回复:
传个字典?
Dictionary<string, bool> initialValues = new Dictionary<string, bool>();
值得考虑一下
回复
csdnFUCKINGSUCKS 2020-07-08
传个字典?
Dictionary<string, bool> initialValues = new Dictionary<string, bool>();
回复
Dear200892 2020-07-08
引用 18 楼 杀马特丶蛮牛 的回复:

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        public Form1(SelectedValues selectedValues) : this()
        {
            this.cb_test.Checked = selectedValues.isTest;
            foreach (Control c in this.Controls)
            {
                if (c is CheckBox checkBox)
                {
                    foreach (var prop in typeof(SelectedValues).GetProperties())
                    {
                        if (checkBox.Name == "cb_" + prop.Name)
                        {
                            checkBox.Checked = (bool)prop.GetValue(selectedValues);
                            break;
                        }
                    }
                }
            }
        }
    }

    public class SelectedValues
    {
        public bool isTest { get; set; } = false;
    }

你的赋值顺序写法了,应该是复选框状态赋值给SelectedValues类。 非常感谢!已经结贴了,没办法把分给你了。
回复
发动态
发帖子
C#
创建于2007-09-28

10.4w+

社区成员

.NET技术 C#
申请成为版主
社区公告

全世界最好的语言,没有之一.