2

文字列のリストが提供される状況があります。リストの最初のエントリはメソッドの名前です。リストの残りの文字列はメソッド引数です。タスクを使用してメソッドを実行したいと思います(教育目的で)。メソッド名をタスク命令に入力できる適切な手順を理解するのに問題があります。

この例では、タスクとして実行できる2つの静的メソッドがあります。args[1]は私の選択を意味します。

public class Program
{
    private static ILog log = LogManager.GetLogger 
                    (System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

    static void Main(string[] args)
    {
        string whichPrint = args[1];

        Type type = typeof(Program);
        MethodInfo meth = type.GetMethod(whichPrint, BindingFlags.Public | 
                                                           BindingFlags.Static);

        //this is the problem area....how do I feed the the method or delegate into 
        //the lambda expression ????
        Delegate methDel = meth.CreateDelegate(type);
        Task t = Task.Factory.StartNew(() => methDel("help!!"));

    }

    static void printme1(string s)
    {
        log.Debug("Printme1 Printing: " + s);
    }

    static void printme2(string s)
    {
        log.Debug("Printme2 Printing: " + s);
    }
}

methDelが変数として表示されているため、コンパイルできません。方法として見るには、それか何か他のものが必要です。タスクに割り当てることができるメソッドがたくさんある可能性があるため、case/switchステートメントは使用しません。

4

2 に答える 2

5

これを使用して新しいタスクを作成するという事実は、多少関係ありません。メソッドを呼び出す方法を理解するだけで、あとは「新しいタスクを開始してからメソッドを呼び出す」だけです。

したがって、おそらく次のようなものが必要です。

public static void CallMethod(List<string> nameAndArguments)
{
    var method = typeof(Program).GetMethod(nameAndArguments[0]);
    method.Invoke(null, nameAndArguments.Skip(1).ToArray()):
}

それで:

Task.Factory.StartNew(() => CallMethod(nameAndArguments));

デリゲートを何度も呼び出すことでパフォーマンスを向上させようとしているのでない限り、デリゲートを作成する価値はないと思います

于 2012-12-10T21:10:58.570 に答える
2

ここではデリゲートは必要ないと思います。アクション本体でメソッドを呼び出すだけです。また、メソッドはパブリックではなくプライベートです。

MethodInfo meth = type.GetMethod(whichPrint, BindingFlags.NonPublic |
                                             BindingFlags.Static);
Task t = Task.Factory.StartNew(() => meth.Invoke(null, new object[] {"help!!"}));
于 2012-12-10T21:10:32.690 に答える