鉴于以下代码:
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
}
然后我如何从字典中为当前控件调用适当的操作?
感谢。
答案 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);
}