[英]Invoke a method from a form
是否可以从表单中调用带有参数的方法? 我知道我可以采取行动。 我想闭包捕获动作中的变量以使其工作。 不过,我觉得方法会更清洁。 我的代码库中有很多这样的动作,我不喜欢它们隐藏在难以重构的方法中。
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);
尝试了重载form.Invoke(AMethod,form);
我得到错误:
参数1:无法从“方法组”转换为“ System.Delegate”
Control.Invoke()的重载为:
public Object Invoke(Delegate method)
public Object Invoke(Delegate method, params Object[] parameters)
第一个参数类型是麻烦制造者, Delegate
是“无类型的”委托类型。 C#编译器坚持使用类型委托,以便它可以验证您是否在调用带有正确签名的方法。 在您的情况下,这意味着您必须传递Action<Form>
类型的委托对象。 要求它仅从方法“ group”推断委托类型是它不会做的。 有点令人讨厌,但在C#中类型安全性至关重要。
因此正确的语法是:
form.Invoke(new Action<Form>(AMethod), form);
没有任何奖品。 难以传递捕获表单变量的lambda语法:
form.Invoke(new Action(() => AMethod(form)));
匿名方法也可以,但是您必须出于相同的原因进行强制转换:
form.Invoke((Action)delegate { AMethod(form); });
根据我原始答案的评论,这是我认为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();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.