2

在关注这个关于从另一个线程更新 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: A lambda expression with a statement body cannot be convert to an expression tree。错误很明显,我只是不确定如何最好地进行。我可以按照我原来的用法并在几行中做我需要的事情,只是没有那么整洁。

我猜有更好/更简单的方法来做我想做的事。

4

1 回答 1

5

如果您不使用表达式,而只是传递操作,如下所示:

public void UpdateControl(Control control, Action actionToExecute)

然后你可以使用它作为书面。唯一的其他更改将是您的 else 语句,您可以直接调用它:

   else
    {
        actionToExecute();
    }
于 2012-08-17T19:34:17.147 回答