2

フォームからパラメータを指定してメソッドを呼び出すことはできますか? 私はアクションを使用できることを知っています。これが機能するように、クロージャーはアクションで変数をキャプチャすると思います。それでも、私はメソッドがよりきれいになると感じています。コードベースにはこれらのアクションがたくさんありますが、リファクタリングが難しいメソッド内に隠されているのは好きではありません。

    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' に変換できません

4

2 に答える 2

13

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);

これは賞品を獲得しません。フォーム変数をキャプチャするラムダ構文を渡すのは難しいです:

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

匿名の方法も機能しますが、同じ理由でキャストする必要があります。

   form.Invoke((Action)delegate { AMethod(form); });
于 2012-10-18T13:58:54.773 に答える
2

元の回答のコメントに基づいて、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();
}
于 2012-10-18T13:57:24.323 に答える