繁体   English   中英

从表单调用方法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM