【问题标题】:Using Activator best way to create instances of classes with multiple constructors?使用 Activator 创建具有多个构造函数的类实例的最佳方法?
【发布时间】:2010-11-16 06:02:42
【问题描述】:

我已经实现了一个“插件”系统,我的应用程序在其中创建了在运行时实现接口以允许可插入功能的类。

我通过在插件程序集中实现指定接口的所有类上使用 Activator.CreateInstance 来实现这一点。

目前我只使用该类的一个实现,为此我有两个构造函数参数,并将它们包含在 Activator.CreateInstance 调用中:

 instanceList.Add((Foo)Activator.CreateInstance(_TypeList[typeKey], new object[] { arg1, arg2 }));

我意识到如果添加不使用此构造函数签名的实现,以后可能会导致问题。处理这个问题的最佳情况是什么。

通过文档明确说明构造函数需要使用此签名,然后将其包围在 try/catch 中?

或者有没有办法调用一个类的任何构造函数?请记住,我必须以某种方式匹配构造函数参数。

或者...通过将参数放在静态类中作为静态属性来避免构造函数参数?

【问题讨论】:

    标签: c# reflection activator


    【解决方案1】:

    首先,我将重构代码以抽象构造以说一个工厂类。然后工厂使用的策略可以决定最佳方式(如果不同)以及在出现错误时该怎么做 - 例如缺少构造函数。您可以根据需要使用泛型使接口具有强类型或松散类型。

    不过,我会坚持使用 Activator。我们在这种构造上做了很多工作,它为我们带来了很多东西,包括基于运行时发现的类型的后期绑定、单例、类型别名、自定义安全等。

    【讨论】:

      【解决方案2】:

      我会要求所有插件都有一个不带参数的构造函数,并向接口添加一个初始化方法,并带有一些通用参数。

      无法知道插件的所有可能实现都需要哪些参数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-02
        • 1970-01-01
        • 2010-11-20
        相关资源
        最近更新 更多