C#将任务作为操作调用的动态方法

C#将任务作为操作调用的动态方法,c#,multithreading,task,C#,Multithreading,Task,我不喜欢switch语句。然而,我不能产生任何替代的想法,情况如下。请给我一个主意 //解析MyTask对象并路由在新任务中执行 专用void性能任务(MyTask任务) { Action taskAction=null; //路由 开关(task.Command) { 案例“MethodX”: taskAction=MethodX; 打破 案例“MethodY”: taskAction=MethodY; 打破 违约: 打破 } if(taskAction==null) 返回; Task t1=

我不喜欢switch语句。然而,我不能产生任何替代的想法,情况如下。请给我一个主意

//解析MyTask对象并路由在新任务中执行
专用void性能任务(MyTask任务)
{
Action taskAction=null;
//路由
开关(task.Command)
{
案例“MethodX”:
taskAction=MethodX;
打破
案例“MethodY”:
taskAction=MethodY;
打破
违约:
打破
}
if(taskAction==null)
返回;
Task t1=Task.Factory.StartNew(taskAction,Task);
}
私有void MethodX(MyTask任务)
{
//做点什么
}
私有void方法(MyTask任务)
{
//做点不同的事
}
//任务负责人结构
公共结构MyTask
{
公共字符串命令;
公共int[]Args;
公共int Id;
公共MyTask(字符串命令,int[]args,int-id)
{
这个命令=命令;
this.Args=Args;
这个.Id=Id;
}
}
//获取下一个任务作为MyTask对象并执行它。
//轮询任务队列的线程方法
私人工程
{
...
MyTask任务=GetNextTask();
执行任务;
...
}
我有一些不同的任务应该异步运行。它们被保存为MyTask结构

DoSomeWorks方法中,下一个任务从我的任务队列中取出,然后传递给PerformTask方法执行性能任务方法(本质)确定将为任务处理的方法。我刚刚用switch case语句实现了这个路由操作。但是,我想动态地这样做。如何使用命令字符串动态调用这些方法

我试过这样的东西;

但我无法从MethodInfo转换为Action。嗯,我需要帮助

编辑:
谢谢你的回答。这两个建议我都试过了。这就是我需要的:


我不再需要动作对象了。因此,我可以将泛型param对象传递给方法。非常感谢您拥有
MethodInfo
,您可以试试

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

Action act = d.Invoke;

有关更多详细信息,请参见的示例部分。

拥有
MethodInfo
,您可以尝试

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

Action act = d.Invoke;
有关更多详细信息,请参见的示例部分。

关于:

MethodInfo methodInfo = typeof(MyClass).GetMethod(task.Command);
if (methodInfo != null)
  Task.Factory.StartNew(() => methodInfo.Invoke(this, new []{ task }));
那么:

MethodInfo methodInfo = typeof(MyClass).GetMethod(task.Command);
if (methodInfo != null)
  Task.Factory.StartNew(() => methodInfo.Invoke(this, new []{ task }));

这只是静态方法吗?抛出“错误绑定到目标方法”错误。@ozancan:Delegate.CreateDelegate中的第二个参数是该方法必须存在的实例。也许此时您的类不正确,需要指定另一个对象?(对于调用静态方法,您需要指定
null
作为第二个参数;对于非null,它是实例方法。)这只是静态方法吗?抛出“错误绑定到目标方法”错误。@ozancan:Delegate.CreateDelegate中的第二个参数是该方法必须存在的实例。也许此时您的类不正确,需要指定另一个对象?(对于调用静态方法,您需要指定
null
作为第二个参数;对于非null,它是实例方法。)