У меня есть эта общая функция для вызова элемента управления WinForm:
public static void Invoke(this Control c, Action action)
{
if (c.InvokeRequired)
c.TopLevelControl.Invoke(action);
else
action();
}
Я думаю сделать это лучше, введя более жесткие ограничения, чтобы предотвратить бессмысленные вещи, например:
button1.Invoke(() => list.Add(1));
Также может быть избыточная типизация, например:
button1.Invoke(() => button1.Hide());
поскольку мы уже указываем, что this
равно button1
.
Итак, я сделал это:
public static void Invoke<T>(this T c, Action<T> action) where T : Control
{
if (c.InvokeRequired)
c.TopLevelControl.Invoke(action);
else
action(c);
}
Теперь мне придется позвонить,
button1.Invoke((c) => c.Hide());
or
button1.Invoke((c) => button1.Hide());
Теперь я чувствую, что даже тогда есть больше, чем требуется. Если я указываю, что this
равно button1
, то в лямбда-выражении я не хочу снова указывать фиктивную переменную c
, чтобы указать, где работать. Могу ли я сделать это снова короче? Возможно, как
button1.Invoke(Hide);
or
button1.Hide.Invoke();
or so in C#?