我不喜欢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 方法(nitty-gritty)确定将为该任务处理哪个方法。我刚用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对象传递给Methods。非常感谢你
答案 0 :(得分:3)
怎么样:
MethodInfo methodInfo = typeof(MyClass).GetMethod(task.Command);
if (methodInfo != null)
Task.Factory.StartNew(() => methodInfo.Invoke(this, new []{ task }));
答案 1 :(得分:1)
拥有MethodInfo
,您可以尝试
Delegate d = Delegate.CreateDelegate(typeof(Action), this, methodInfo);
Action act = () => d.DynamicInvoke;
或只是
Action act = d.Invoke;
有关详细信息,请参阅MSDN article on Delegate.CreateDelegate
的示例部分。