在运行时动态选择命名空间和类

时间:2018-06-19 18:28:14

标签: c# asp.net

我有一个应用程序,其中包含一系列服务参考,这些参考几乎每月都会更改。如果根本不存在更改,大多数情况下更改很少。我希望能够根据配置文件中定位的版本来选择在运行时使用哪个引用。例如。我下面的NameSpace可能有三个版本,都具有Class1。 Class1在版本之间可能会有微小的变化,例如附加属性。任何指导都会有所帮助:)

NameSpaceVersion1.Class1 MyVar = new NameSpaceVersion1.Class1();
NameSpaceVersion2.Class1 MyVar = new NameSpaceVersion2.Class1();
NameSpaceVersion3.Class1 MyVar = new NameSpaceVersion3.Class1();

3 个答案:

答案 0 :(得分:1)

如果这三个名称空间在同一个DLL中

您可以尝试将Activator.CreateInstanceType.GetType功能一起使用。

  • Type.GetType(nameSapce)在此DLL中获取带有名称空间的类类型
  • Activator.CreateInstance引用创建对象。

像这样

string nameSapce = ConfigurationManager.AppSettings["NameSpace"];
var MyVar = Activator.CreateInstance(Type.GetType(nameSapce));

webConfig

上设置

NameSpace可以设置要在运行时创建的类。

<configuration>
  <appSettings>
    <add key="NameSpace" value="NameSpaceVersion2.Class1"/>
  </appSettings>
</configuration>

答案 1 :(得分:0)

您似乎正在寻找的是Assembly.LoadFrom(filepath / binary),请参见msdn,并使用Activator.CreateInstance()创建您配置的实例,请参见msdn

答案 2 :(得分:0)

这是接口的好用法。

但是,如果您不能更改实现(因此每个类都实现了接口),则可以创建这样做的包装器类。

基本上,为每个实现目标接口的实现创建一个类,但是将调用传递给目标实现。您将实现类传递给构造函数中的包装器类,然后将其存储为私有字段,该私有字段将用于接口的每个公共成员访问。