Как упростить код с дублированием компонентов?

Пример абстрактный. Допустим на форме есть три checkBox. Если нажат первый, то переменная увеличивается на 1200, если нажат второй, то переменная увеличивается на 400, если на третий, то переменная увеличивается на 800. Код

If (checkBox1.Checked)
    itog += 1200;
If (checkBox2.Checked)
    itog += 400;
If (checkBox3.Checked)
    itog += 800;

Как упростить такой код? Switch не воспользоваться, так как компоненты разные. Обращаться через Controls, тогда будет еще больше кода. Понятно одно, что такая реализация очень некрасивая, но сделать ее лучше у меня не получается. Надеюсь, что мне откроют глаза на то, как не дублировать код в данном и смежных случаях.


Ответы (1 шт):

Автор решения: Алексей Обухов

можно что-то в таком духе написать:

private void button1_Click(object sender, EventArgs e)
{
    int itog = 0;
    int cntAll = 0;
    int cntCheck = 0;
    foreach (Control c in this.Controls)
    {
        cntAll++;
        int i;
        if (c is CheckBox && ((CheckBox)c).Checked && int.TryParse(c.Tag?.ToString(), out i))
        {
            cntCheck++;
            itog += i;
        }
    }

    MessageBox.Show(this, $"Всего контролов: {cntAll}, выбрано чекбоксов со значением: {cntCheck}, сумма выбранных значений: {itog}");
}

Идея в использовании специального поля Tag у чекбокса для хранения пользовательской информации (там может быть не только строка, а любой объект).

Значение поля Tag можно задавать в дизайнере.

→ Ссылка