Действие <T>вопрос - PullRequest
0 голосов
/ 31 мая 2011

Учитывая код ниже:

private static Dictionary<Type, Action<Control>> controlDefaults = new Dictionary<Type, Action<Control>>()
    {
        { typeof(TextBox), c => ((TextBox)c).Clear() }
    };

Как бы я вызвал действие в этом случае? Это фрагмент кода, взятый из другого места, и словарь будет содержать гораздо больше экземпляров элементов управления. Это будет использоваться для сброса всех элементов управления в форме к их значениям по умолчанию.

Итак, я бы повторил:

foreach (Control control in this.Controls)
{
    // Invoke action for each control
}

Как бы я тогда назвал соответствующее действие из словаря для текущего элемента управления?

Спасибо.

Ответы [ 3 ]

3 голосов
/ 31 мая 2011

Вы можете написать

controlDefaults[control.GetType()](control);

Вы также можете использовать статический универсальный класс в качестве словаря и избежать приведения:

static class ControlDefaults<T> where T : Control {
    public static Action<T> Action { get; internal set; }
}

static void Populate() {
    //This method should be called once, and should be in a different class
    ControlDefaults<TextBox>.Action = c => c.Clear();
}

Однако вы быневозможно вызвать это в цикле, так как вам нужно знать тип во время компиляции.

2 голосов
/ 31 мая 2011
foreach (Control control in this.Controls)
{
    Action<Control> defaultAction = controlDefaults[control.GetType()];
    defaultAction(control);

    // or just
    controlDefaults[control.GetType()](control);
}
2 голосов
/ 31 мая 2011

Вы вызываете его как функцию.

Например:

Action<Foo> action = foo => foo.Bar();
action(f);

Так в вашем случае:

foreach(Control control in this.Controls)
{
    controlDefaults[control.GetType()](control);
}
...