行动<t>问题</t>

时间:2011-05-31 14:30:51

标签: c# .net action

鉴于以下代码:

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 个答案:

答案 0 :(得分:3)

你可以写

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

你也可以use a static generic class作为字典,并避免演员:

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();
}

但是,您无法在循环中调用它,因为您需要在编译时知道类型。

答案 1 :(得分:2)

你像函数一样调用它。

E.g:

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

所以在你的情况下:

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

答案 2 :(得分:2)

foreach (Control control in this.Controls)
{
    Action<Control> defaultAction = controlDefaults[control.GetType()];
    defaultAction(control);

    // or just
    controlDefaults[control.GetType()](control);
}