我有这个通用函数来调用 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
is 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
is button1
,那么在 lambda 表达式中我不想指定虚拟变量c
再次告诉在哪里进行操作。无论如何,我可以再把它缩短吗?也许喜欢
button1.Invoke(Hide);
or
button1.Hide.Invoke();
或者在 C# 中是这样?
为了构建其他答案,我会将其放入一个单独的扩展类中。
public static void Invoke<T>(this T c, Action<T> action) where T : Control
{
if (c.InvokeRequired)
c.Invoke(new Action<T, Action<T>>(Invoke), new object[] { c, action });
else
action(c);
}
这将防止TargetParameterCountException
避免在跨线程时被抛出。
To Call:
button1.Invoke(x => x.Hide());
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)