您能给我一些指导来根据名称动态加载类吗?该名称在运行时作为参数提供。

    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"));

07-24 20:46