动作<;T>;问题

本文关键字:问题 gt 动作 lt | 更新日期: 2023-09-27 17:58:07

给定以下代码:

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
}

然后,我将如何从字典中为当前控件调用适当的操作?

谢谢。

动作<;T>;问题

您可以编写

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

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

您可以像函数一样调用它。

例如:

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

所以在你的情况下:

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