gpt4 book ai didi

c# - 从表单调用方法

转载 作者:太空宇宙 更新时间:2023-11-03 17:55:10 24 4
gpt4 key购买 nike

是否可以从表单调用带有参数的方法?我知道我可以使用一个 Action 。我想闭包捕获 Action 中的变量以允许它工作。尽管如此,我还是觉得 Methods 会更简洁。我的代码库中有很多这样的操作,我不喜欢它们隐藏在难以重构的方法内部。

    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); 尝试了重载,但出现错误:

Argument 1: cannot convert from 'method group' to 'System.Delegate'

最佳答案

Control.Invoke() 的重载是:

  public Object Invoke(Delegate method)
public Object Invoke(Delegate method, params Object[] parameters)

第一个参数类型是麻烦制造者,Delegate是一个“无类型”委托(delegate)类型。 C# 编译器坚持要求您使用类型化委托(delegate),以便它可以验证您正在调用具有正确签名的方法。在您的情况下,这意味着您必须传递 Action<Form> 类型的委托(delegate)对象.要求它仅从方法“组”推断委托(delegate)类型是它不会做的。有点烦人,但类型安全在 C# 中至关重要。

所以正确的语法是:

  form.Invoke(new Action<Form>(AMethod), form);

没有赢得任何奖品。很难传递捕获表单变量的 lambda 语法:

   form.Invoke(new Action(() => AMethod(form)));

匿名方法也可以,但出于同样的原因你必须转换:

   form.Invoke((Action)delegate { AMethod(form); });

关于c# - 从表单调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12955533/

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