动作<;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
}
然后,我将如何从字典中为当前控件调用适当的操作?
谢谢。
您可以编写
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);
}