您能给我一些指导来根据名称动态加载类吗?该名称在运行时作为参数提供。
static void Main(string[] args)
{
...
}
假设我的参数是“ parrot”,那么我想加载我的
parrotProcessor
类。如果我的参数名称是“ snake”,那么我将加载To make snakeProcessor
。当然,这意味着我有一个继承接口IProcessor的鹦鹉和蛇处理器类。我不知道所有处理器的清单是什么。此列表由其他开发人员维护,他们可以创建所需的内容。我的处理器接口示例:
public interface IProcessor
{
void Process();
}
在我的Program.cs中
static void Main(string[] args)
{
var processor = GetProcessor(args[0]);
processor.Process();
}
我的问题是我应该在
GetProcessor()
方法中做什么?这是我目前的状态:
private IProcessor GetProcessor(string name)
{
switch (name)
{
case "ant":
return new AntProcessor();
case "parrot":
return new ParrotProcessor();
case "snake":
return new SnakeProcessor();
default:
throw new ArgumentException("Case not found");
}
}
但这意味着每次创建新的处理器专用类时,我都必须更新此丑陋的开关。这是不可能的。我现在可以为发展而做,但不是长期的。
有什么解决方案?我应该在NInject中使用类似于DI的东西还是要混合所有东西?我可以简单地使用Invoke方法吗?以及为什么调用或DI?我知道这个问题是一个开放性问题,但是它在很多人的代码中经常发生,因此我想有一个独特的最佳实践。
最佳答案
您可以使用以下内容
var type = Type.GetType("MyFullyQualifiedTypeName");
var myObject = (MyAbstractClass)Activator.CreateInstance(type);
您需要进行一些字符串修改,例如使用单词,添加处理器字符串并确保所有处理器都在同一位置。
如果确定类型在当前程序集中,则只需使用此名称即可
Activator.CreateInstance(Type.GetType("SomeProcessor"));