gpt4 book ai didi

c# - 将语句 lambda 作为参数传递

转载 作者:行者123 更新时间:2023-12-02 05:33:38 25 4
gpt4 key购买 nike

关注this question之后在从另一个线程更新 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 表达式转换为表达式树。错误很明显,我只是不确定如何最好地进行。我可以按照我原来的用法,在几行中做我需要的,只是不那么整洁。

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

最佳答案

如果不使用表达式,只传递 Action ,像这样:

public void UpdateControl(Control control, Action actionToExecute)

然后你就可以像写的那样使用它了。唯一的其他变化是您的 else 语句,您可以在其中直接调用它:

   else
{
actionToExecute();
}

关于c# - 将语句 lambda 作为参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12012012/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com