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

C# 有什么更好的方法可以实例化在运行时指定的类,并在该实例上调用方法?,c#,dynamic,reflection,C#,Dynamic,Reflection,我有一个命令行应用程序,它必须能够执行许多离散任务中的一个,给定一个动词作为命令行参数。每个任务由一个类处理,每个类实现一个包含方法Execute()的接口。我尝试在不使用if或switch语句的情况下执行此操作。到目前为止,我得到的是: var taskTypeName = $"MyApp.Tasks.{invokedVerb}Task"; var taskType = Type.GetType(taskTypeName, false); var task = Activator.Create

我有一个命令行应用程序,它必须能够执行许多离散任务中的一个,给定一个动词作为命令行参数。每个任务由一个类处理,每个类实现一个包含方法
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
属于
imantenancetask
类型,这正是我试图实现的基本目标。我宁愿避免使用
动态
——我的理解是,如果像这里这样只使用一次,我将看不到缓存的任何好处,只需较少的击键即可反映出来


这种方法(或类似的方法)是否可能显著影响性能?我知道这肯定会增加运行时异常/bug的机会,但这在一定程度上是因为这个应用程序只能通过脚本运行;它将只处理可预测的输入-这也是代码中唯一动态行为的地方。我试图实现的目标是否明智?或者最好是以一种枯燥的常规方式,通过打开输入,通过一个普通的编译时构造函数构造每种类型的任务,然后调用.Execute()

不要担心分派机制的性能,除非它处于紧密循环中。通过
dynamic
将单个直接方法调用切换为单个调用、通过反射切换为单个调用、通过emit API切换为单个调用或通过编译的LINQ表达式切换为单个调用,都不会对应用程序的执行时间产生可检测的差异。操作系统启动应用程序所需的时间比应用程序决定调用哪种方法所需的时间高出几个数量级,因此您的解决方案与
开关一样好,只是时间要短得多(这是一件好事)。

因为它只是一次调用,所以您可以使用您的解决方案。只需添加一些条件,以避免出现异常

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

IsAssignableFrom()
正是我需要知道的使我熟悉此代码的函数,我想如果您打算过于频繁地使用命令,您可以轻松地将实例缓存在
字典中