繁体   English   中英

有什么更好的方法来实例化在运行时指定的类,并在该实例上调用方法?

[英]What better ways are there to instantiate a class specified at runtime, and call a method on that instance?

我有一个命令行应用程序,它必须能够执行多个离散任务之一,给定一个动词作为命令行参数。 每个任务由一个类处理,每个类都实现一个包含方法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 -我的理解是,如果只使用一次,就像这里一样,我将看不到缓存的任何好处,只能在较少的击键中体现出来。

这种方法(或类似方法)是否会明显影响性能? 我知道这肯定会增加运行时异常/错误的机会,但是由于此应用程序仅通过脚本运行,因此部分缓解了这种情况。 它只会处理可预测的输入-这也是代码中动态行为的唯一位置。 我想达到的目的是明智的吗? 还是最好这样做 无聊 正常方式是,只需打开输入并通过正常的编译时构造函数构造每种任务,然后在其上调用.Execute()。

除非它处于紧密的循环中,否则不必担心调度机制的性能。 通过dynamic将单个直接方法调用切换为单个调用,将其切换为通过反射进行的单个调用,将其通过发出API进行的单个调用,或者将其通过编译的LINQ表达式进行的单个调用都不会在应用程序的执行时间上产生可察觉的差异。 操作系统启动您的应用程序所需的时间比应用程序决定调用哪种方法所花费的时间高几个数量级,因此您的解决方案与switch一样好,只是它的switch时间短得多(好东西)。

由于只有一次通话,您可以选择解决方案。 只需添加一些条件即可避免出现异常情况的机会。

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();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM