【发布时间】:2018-01-15 21:49:51
【问题描述】:
是否可以使用表单中的参数调用方法?我知道我可以使用一个动作。我想闭包会在动作中捕获变量以使其起作用。不过,我觉得方法会更干净。我的代码库中有很多这样的操作,我不喜欢它们隐藏在难以重构的方法中。
public static void Main()
{
Form form = new Form();
Action action = () => form.SendToBack();//(Now Imagine this Action is 50 lines of code and there's 15 of them...Then it should make sense as to why I want to seperate this logic out into classes and methods.
//Action action2 = AMethod(form);//doesnt work
Task.Factory.StartNew(
() =>
{
//form.Invoke(AMethod);//doesnt work see error below...also no params
form.Show();
form.Invoke(action);
Application.Run();
}
);
Console.Read();
}
public static void AMethod(Form form)
{
form.SendToBack();
}
更新
我尝试了每个 cmets form.Invoke(AMethod,form); 的重载,但出现错误:
参数 1:无法从“方法组”转换为“System.Delegate”
【问题讨论】:
-
在表单中添加一个按钮并对点击事件采取行动? (哎呀误解了这个问题)
-
有一个重载的
Form.Invoke接受参数参数... -
很难说出你想要做什么。您可以只调用
AMethod(form);,这将调用表单的SendToBack方法。此外,如果需要,您可以将参数传递给Invoke。 -
@Alex:如果表单是在另一个线程中创建的,那么调用 AMethod(form) 将不起作用,这就是代码所暗示的。你会得到 CrossThreadOperation 异常。
-
@Neolisk - 这是使用
Invoke来避免该异常的关键。