猿问

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

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


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

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

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


慕妹3146593
浏览 182回答 3
3回答

holdtom

如果这三个命名空间在同一个 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>&nbsp; <appSettings>&nbsp; &nbsp; <add key="NameSpace" value="NameSpaceVersion2.Class1"/>&nbsp; </appSettings></configuration>

郎朗坤

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

慕码人8056858

这是接口的一个很好的用途。但是,如果您无法更改实现(因此每个类都实现接口),您可以创建这样做的包装类。基本上,为每个实现目标接口的实现创建一个类,但将调用传递给目标实现。您可以将实现类传递给构造函数中的包装类,然后将其存储为私有字段,该字段将用于接口的每个公共成员访问。
随时随地看视频慕课网APP
我要回答