2

私はswitch文が好きではありません。ただし、次のような状況に代わるアイデアを生み出すことはできません。アイデアをください。

// Parses MyTask object and routes for execution at a new task
private void PerformTask(MyTask task)
{
    Action<object> taskAction = null;

    // routing
    switch (task.Command)
    {
        case "MethodX":
            taskAction = MethodX;
            break;

        case "MethodY":
            taskAction = MethodY;
            break;

        default:
            break;
    }

   if (taskAction == null)
        return;

    Task t1 = Task.Factory.StartNew(taskAction, task);
}

private void MethodX(MyTask task)
{
    // do it something
}

private void MethodY(MyTask task)
{
    // do it something different
}

// task holder struct
public struct MyTask
{
    public string Command;
    public int[] Args;
    public int Id;

    public MyTask(string command, int[] args, int id)
    {
        this.Command = command;
        this.Args = args;
        this.Id = id;
    }

}

// Gets next task as a MyTask object and performs it.
// Thread method that is polls task queue
private void DoSomeWorks()
{
   ...
   MyTask task = GetNextTask();
   PerformTask(task);
   ...
}

非同期で実行する必要があるいくつかの異なるタスクがあります。これらは MyTask 構造体として保持されます。

DoSomeWorksメソッドでは、次のタスクがタスク キューから取得され、 PerformTaskメソッドに渡されて実行されます。PerformTaskメソッド (詳細) は、タスクに対してどのメソッドが処理されるかを決定します。このルーティング操作を switch case ステートメントで実装しました。しかし、私はこれを動的に行いたいです。コマンド文字列を使用してメソッドを動的に呼び出すにはどうすればよいですか?

私はこのようなことを試しました;

MethodInfo methodInfo = typeof(MyClass).GetMethod(task.Command);

MethodInfo から Action に変換できません。ええと、私は助けが必要です。

編集:
回答ありがとうございます。私は両方の提案を試しました。これは私が必要なものです:

private void PerformTask(MyTask task)
{
  MethodInfo methodInfo = typeof(MyClass).GetMethod(task.Command);

  if (methodInfo != null)
    Task.Factory.StartNew(() => methodInfo.Invoke(this, new object[] { task }));
}

Action オブジェクトはもう必要ありません。したがって、ジェネリック param オブジェクトをメソッドに渡すことができます。どうもありがとう

4

2 に答える 2

3

どうですか:

MethodInfo methodInfo = typeof(MyClass).GetMethod(task.Command);
if (methodInfo != null)
  Task.Factory.StartNew(() => methodInfo.Invoke(this, new []{ task }));
于 2012-09-08T21:40:39.610 に答える
1

を持っているのでMethodInfo、試すことができます

Delegate d = Delegate.CreateDelegate(typeof(Action), this, methodInfo);
Action act = () => d.DynamicInvoke;

あるいは単に

Action act = d.Invoke;

詳細については、 MSDN 記事Delegate.CreateDelegateのサンプル セクションを参照してください。

于 2012-09-08T21:39:45.490 に答える