Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在运行时动态选择命名空间和类_C#_Asp.net - Fatal编程技术网

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

C# 在运行时动态选择命名空间和类,c#,asp.net,C#,Asp.net,我有一个应用程序,它有一系列服务引用,几乎每个月都会更改。大多数情况下,如果存在任何变化,则变化很小。我希望能够根据配置文件中的目标版本选择在运行时使用哪个引用。例如我可能有以下名称空间的三个版本,它们都有Class1。Class1在版本之间可能会有一些小的更改,比如附加属性。任何指导都会有帮助: NameSpaceVersion1.Class1 MyVar = new NameSpaceVersion1.Class1(); NameSpaceVersion2.Class1 MyVar = ne

我有一个应用程序,它有一系列服务引用,几乎每个月都会更改。大多数情况下,如果存在任何变化,则变化很小。我希望能够根据配置文件中的目标版本选择在运行时使用哪个引用。例如我可能有以下名称空间的三个版本,它们都有Class1。Class1在版本之间可能会有一些小的更改,比如附加属性。任何指导都会有帮助:

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

您要查找的似乎是Assembly.LoadFromfilepath/binary请查看并使用Activator创建您配置的实例。CreateInstance请参见。

这是接口的一个很好的用途

但是,如果无法更改实现以使每个类实现接口,则可以创建这样做的包装器类


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

如果这三个命名空间位于同一DLL中

您可以尝试将Activator.CreateInstance与Type.GetType函数一起使用

Type.getTypeNames获取此DLL中具有命名空间的类类型 Activator.CreateInstance回流创建对象。 像这样

string nameSapce = ConfigurationManager.AppSettings["NameSpace"];
var MyVar = Activator.CreateInstance(Type.GetType(nameSapce));
在webConfig上设置

键命名空间可以设置要在运行时创建的类

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

这听起来很痛苦,但我会先看看反射,也许吧?另一种选择可能是DI。我很想看看建议的答案。Chris,Class1的这些版本有接口或其他共同点吗?没有。它们是独立的服务引用,差异最小。它们是在同一个dll中使用还是在不同的dll中使用?都在同一个DLLA中,指向潜在解决方案的链接总是受欢迎的,但是,请在链接周围添加上下文,这样您的其他用户就会知道它是什么以及为什么会出现。始终引用重要链接中最相关的部分,以防目标站点无法访问或永久脱机。这一点很好。我的另一个想法是,不用严格遵守服务引用,我可以在没有任何服务引用的情况下手动构建SOAP请求。然后,我只需要通过引用配置中使用的版本并用IF/ELSE语句包装这些元素来解释这些小更改。