我有一个命令行应用程序,给定一个动词作为命令行参数,它必须能够执行多个离散任务中的一个。每个任务由一个类处理,每个类实现一个包含方法Execute()
的接口。我试图在不使用if或switch语句的情况下做到这一点。到目前为止,我得到的是:
var taskTypeName = $"MyApp.Tasks.{invokedVerb}Task";
var taskType = Type.GetType(taskTypeName, false);
var task = Activator.CreateInstance(taskType) as IMaintenanceTask;
task.Execute();
task
是IMaintenanceTask
类型,这基本上是我想要实现的。我更愿意避免使用dynamic
—我的理解是,如果它只使用一次,就像这里一样,我将看不到缓存的任何好处,使其在更少的击键中进行反射。
这种方法(或类似的方法)可能会显著影响性能吗?我知道它肯定会增加运行时异常/错误的机会,但这是部分缓解的事实,这个应用程序只会通过脚本运行;它将只处理可预测的输入-这将是代码中唯一动态行为的地方。我想达到的目标是明智的吗?或者,用无聊的
由于这只是一次调用,您可以使用您的解决方案。只需添加一些条件,以避免出现异常。
var taskTypeName = $"MyApp.Tasks.{invokedVerb}Task";
var taskType = Type.GetType(taskTypeName, false);
if (taskType != null && typeof(IMaintenanceTask).IsAssignableFrom(taskType))
{
var task = Activator.CreateInstance(taskType) as IMaintenanceTask;
task.Execute();
}
不要担心调度机制的性能,除非它处于紧密循环中。将单个直接方法调用切换为通过dynamic
的单个调用、通过反射的单个调用、通过emit API的单个调用或通过编译的LINQ表达式的单个调用,不会对应用程序的执行时间产生可检测到的差异。操作系统启动应用程序所需的时间比应用程序决定调用什么方法所需的时间高几个数量级,因此您的解决方案与switch
一样好,除了它要短得多(这是一件好事)。