为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
慕妹3146593 2021-08-22 14:52:12
我有一个应用程序,其中包含一系列几乎每月都会更改的服务引用。大多数情况下,如果有任何变化,变化很小。我希望能够根据配置文件中的目标版本选择在运行时使用哪个引用。例如。我可能有以下 NameSpace 的三个版本,它们都具有 Class1。Class1 可能在版本之间有细微的变化,比如附加属性。任何指导都会有所帮助:)NameSpaceVersion1.Class1 MyVar = new NameSpaceVersion1.Class1();NameSpaceVersion2.Class1 MyVar = new NameSpaceVersion2.Class1();NameSpaceVersion3.Class1 MyVar = new NameSpaceVersion3.Class1();
查看完整描述

3 回答

?
holdtom

TA贡献1805条经验 获得超10个赞

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


您可以尝试使用Activator.CreateInstancewithType.GetType函数。


Type.GetType(nameSapce) 在此 DLL 中获取具有命名空间的类类型

Activator.CreateInstance relation 创建一个对象。

像这样。


string nameSapce = ConfigurationManager.AppSettings["NameSpace"];

var MyVar = Activator.CreateInstance(Type.GetType(nameSapce));

在webConfig 上设置


keyNameSpace可以设置你想在运行时创建哪个类。


<configuration>

  <appSettings>

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

  </appSettings>

</configuration>


查看完整回答
反对 回复 2021-08-22
?
郎朗坤

TA贡献1921条经验 获得超9个赞

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


查看完整回答
反对 回复 2021-08-22
?
慕码人8056858

TA贡献1803条经验 获得超6个赞

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

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

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


查看完整回答
反对 回复 2021-08-22
  • 3 回答
  • 0 关注
  • 181 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信