是否可以使用表单中的参数调用方法?我知道我可以使用一个动作。我认为闭包捕获动作中的变量以允许它工作。不过,我觉得方法会更清洁。我在代码库中有很多这些动作,我不喜欢它们隐藏在难以重构的方法中。
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();
}
更新
我根据评论form.Invoke(AMethod,form);
尝试了重载,我收到错误:
参数1:无法从'方法组'转换为'System.Delegate'
答案 0 :(得分:6)
Control.Invoke()的重载是:
public Object Invoke(Delegate method)
public Object Invoke(Delegate method, params Object[] parameters)
第一个参数类型是麻烦制造者,Delegate
是“无类型”委托类型。 C#编译器坚持使用类型化的委托,以便它可以验证您是否正在使用正确的签名调用方法。在您的情况下,这意味着您必须传递类型为Action<Form>
的委托对象。要求它仅从方法“组”推断委托类型是它不会做的。有点烦人,但类型安全在C#中是最重要的。
所以正确的语法是:
form.Invoke(new Action<Form>(AMethod), form);
哪个没有赢得任何奖品。很难传递捕获表单变量的lambda语法:
form.Invoke(new Action(() => AMethod(form)));
匿名方法也有效,但出于同样的原因你必须施放:
form.Invoke((Action)delegate { AMethod(form); });
答案 1 :(得分:3)
基于我原来答案的评论,这是一个新的,我相信OP正在寻找。感谢您转换为C#的帮助。
public static void Main()
{
Form form = new Form();
Action action = New Action<Form>(AMethod);
Task.Factory.StartNew(
() =>
{
form.Show();
form.Invoke(action, form);
Application.Run();
}
);
Console.Read();
}
public static void AMethod(Form form)
{
form.SendToBack();
}