在回答了这个问题从另一个线程更新 GUI 之后,我想稍微扩展代码,以便它适用于属性分配以外的其他内容。 具体来说,我试图找到一种方法将某些功能直接分配给 lambda,以便我可以根据需要定义行为(我稍微修改了 WPF 的原始内容):
private delegate void UpdateControlThreadSafeDelegate(Control control, System.Linq.Expressions.Expression<Action> property);
public void UpdateControl(Control control, System.Linq.Expressions.Expression<Action> property)
{
// If calling thread is not associated with control dispatcher, call our thread safe property update delegate
if (!control.Dispatcher.CheckAccess())
{
control.Dispatcher.Invoke(new UpdateControlThreadSafeDelegate(UpdateControl), new object[] { control, property });
}
else
{
Action call = property.Compile();
call();
}
}
使用:
UpdateControl(lbFoo, () => lbFoo.Items.Clear()); // where lbFoo is a ListBox control
这工作正常。 但我宁愿允许做这样的事情:
UpdateControl(lbFoo, () => { lbFoo.Items.Clear(); lbFoo.Items.Add("Bar");});
这不起作用,返回错误 CS0834:具有语句正文的 lambda 表达式无法转换为表达式树。 错误很明显,我只是不确定如何最好地进行。 我可以按照我原来的用法,在几行中做我需要的事情,只是不那么整洁。
我猜有一种更好/更简单的方法来做我想做的事情。
如果您不使用表达式,而只是传递操作,如下所示:
public void UpdateControl(Control control, Action actionToExecute)
然后你可以按照书面形式使用它。 唯一的其他更改将是您的 else 语句,您只需直接调用它:
else
{
actionToExecute();
}