首页 > 解决方案 > 动态调用一个类

问题描述

假设我有来自两个提供商的两个相同的服务,并且我想编写一个代码来根据客户端请求调用其中一个。

更清楚地说,我有提供者 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();
    }
}

但是这种方法需要我在每次添加新的提供者时编辑提供者管理器类。

我想知道是否有一种方法可以在不更改代码的情况下以更动态的方式调用所需的类。

标签: c#oop.net-core

解决方案


您可以使用一些替代方法来完成此操作:

通用类型

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");

推荐阅读