c# - 动态调用一个类
问题描述
假设我有来自两个提供商的两个相同的服务,并且我想编写一个代码来根据客户端请求调用其中一个。
更清楚地说,我有提供者 A 和提供者 B。客户端将提交对 A 或 B 的请求,因此我必须调用他们的类来处理请求。
我创建了提供者接口
interface IProviderInterface
{
string GetRedirectUrl();
string GetStatus();
}
那么每个提供者类都实现了接口
public class ProviderA: IProviderInterface
{
public ProviderA()
{
}
public string GetRedirectUrl()
{
return "URL for provider A";
}
public string GetStatus()
{
return "Check status with provider A API";
}
}
现在在提供者管理器类中,我使用 switch 语句来调用所需的提供者类。
public class ProvidersManager
{
IProviderInterface ProviderObj;
public ProvidersManager(string ProviderName)
{
switch (ProviderName)
{
case "A":
ProviderObj = new ProviderA();
break;
case "B":
ProviderObj = new ProviderB();
break;
}
}
public string GetRedirectUrl()
{
return ProviderObj.GetRedirectUrl();
}
public string GetStatus()
{
return ProviderObj.GetStatus();
}
}
但是这种方法需要我在每次添加新的提供者时编辑提供者管理器类。
我想知道是否有一种方法可以在不更改代码的情况下以更动态的方式调用所需的类。
解决方案
您可以使用一些替代方法来完成此操作:
通用类型
public class ProvidersManager<TProvider> where TProvider : IProviderInterface
{
public ProvidersManager() =>
ProviderObj = Activator.CreateInstance<TProvider>();
}
// eg: new ProvidersManager<ProviderA>();
使用类型(在其他地方之前加载)
public ProvidersManager(Type providerImplementationType) =>
ProviderObj = (IProviderInterface)Activator.CreateInstance(myType);
// eg: new ProvidersManager(typeof(ProviderA));
使用类型全名
public ProvidersManager(string providerFullName) =>
ProviderObj = (IProviderInterface)Activator.CreateInstance(Type.Load(providerFullName));
// eg: new ProvidersManager("MyApplication.Common.ProviderA");
推荐阅读
- r - 在ggplot中缩放两个y轴
- cuda - Cuda中的静态关键字
- react-native - 如何使用本机反应悬停在文本下划线?
- android - Android searchview在搜索后隐藏在recyclerview中
- vue.js - 我如何在 vue 中做一个等效的 JS?(n 个数的增量)
- excel - 如何在 VBA 代码中创建可变列宽
- sql - 值的区间范围
- python - 获取列表对象不可调用错误
- php - Wordpress - 致命错误:未捕获的错误:在 null 上调用成员函数 has_package()
- python - 当我无法获取用户输入或手动创建新实例时,oop 的优势是什么?