我们可以在C#中在运行时动态交换程序集吗?

时间:2012-09-17 16:41:47

标签: c#

请考虑以下代码 -

namespace N1
{
    class A
    {
        //some implementation
    }
    class B
    {
        //some implemntation
    }
}

namespace N2
{
    class A
    {
        //slightly different implementation
    }
    class B
    {
        //slightly different implementation
    }    
}

显然我们不能同时使用这两个组件 -

决议是使用完全限定的类名。当重构使用N1名称空间类的1000行代码时。在过程启动时做出一次决定,必须使用N1或N2。

比C ++中的条件编译功能更高级的东西

#ifdef debug
#include <N1.h>
#elif
#include <N2.h>
#endif

对不起,如果这听起来不可能,但出于好奇,我想知道是否可以这样做 -

if (...)
    {
        using N1; 
    }
else
    {
        using N2;
    }

2 个答案:

答案 0 :(得分:2)

我认为你想要的是接口和IoC容器/工厂。

AB引用的单独程序集中,为所有方法N1N2提供接口。在两个程序集中实现这些接口。然后连接一个IoC容器,它在运行时解析正确的实现。

答案 1 :(得分:2)

然而,您描述的基于using的方法不起作用。 “使用命名空间”实际上只是一个编译时构造,因此它对运行时行为没有影响。在运行时,使用完全限定类型。

处理此问题的一种典型方法是通过MEF等库使用IoC的形式。

如果您使两个名称空间中的类型派生自相同的基类,或实现相同的接口,则可以[Export]来自两个单独程序集的类型。可以在运行时决定组合哪个程序集。这样您就可以根据需要使用[Import]类型,并获得相应的类型。