如何在C#中返回多种类型的数据

时间:2018-06-29 10:43:27

标签: c# class generics methods instance

我确实会根据应用程序中的枚举返回不同的服务实例:

public (????) CurrentService
{
    get
    {
        switch (CurrentServiceEnum)
        {
            case ServiceType.ServiceA:
                return IoC.ServiceA;
            case ServiceType.ServiceB:
                return IoC.ServiceB;
            case ServiceType.ServiceC:
                return IoC.ServiceC;
        }
    }
}

该服务的每一个都有其自己的RemoveAccount方法的实现,采用不同类型的参数。

internal class ServiceA_AccountDataModel { [..] }
internal class ServiceB_AccountDataModel { [..] }
internal class ServiceC_AccountDataModel { [..] }

public class ServiceA {
    public void RemoveAccount(ServiceA_AccountDataModel model) { [...] }
}
public class ServiceB {
    public void RemoveAccount(ServiceB_AccountDataModel model) { [...] }
}
public class ServiceC { 
    public void RemoveAccount(ServiceC_AccountDataModel model) { [...] }
}

我在这里想要实现的是能够在返回的当前服务之外调用RemoveAccount方法,以便在传递account的{​​{1}}时应自动解析为ServiceC_AccountDataModel

IoC.ServiceC

有没有办法在C#中实现类似的目标?

1 个答案:

答案 0 :(得分:1)

一种实现此目的的方法是让所有服务实现一个公共接口:

public interface IAccountRemovalService<T>
{
    void RemoveAccount<T>(T model);
}

public class ServiceA : IAccountRemovalService<ServiceA_AccountDataModel>
{
    public void RemoveAccount<ServiceA_AccountDataModel>(ServiceA_AccountDataModel model) 
    { 
    }
}

public class ServiceB : IAccountRemovalService<ServiceB_AccountDataModel>
{
    public void RemoveAccount<ServiceB_AccountDataModel>(ServiceA_AccountDataModel model) 
    { 
    }
}

要使其正常工作,您确实需要在每个模型类型之间都有一些共同点,例如AccountModelDataBase之类的基类:

public class ServiceA_AccountDataModel : AccountDataModelBase {}

public class AccountDataModelBase {}

一旦掌握了这一点,就有可能按照以下几行来重新编写CurrentService属性:

public IAccountRemovalService<AccountDataModelBase> CurrentService
{
    get
    {
        IAccountRemovalService<AccountDataModelBase> returnedValue = null;
        switch (CurrentServiceEnum)
        {
            case ServiceType.ServiceA:
                returnedValue = IoC.ServiceA as IAccountRemovalService<AccountDataModelBase>;
                break;
            case ServiceType.ServiceB:
                returnedValue = IoC.ServiceB as IAccountRemovalService<AccountDataModelBase>;
                break;
            case ServiceType.ServiceC:
                returnedValue = IoC.ServiceC as IAccountRemovalService<AccountDataModelBase>;
                break;
        }
        return returnedValue;
    }
}

这确实涉及对代码的许多更改,添加了接口和基类,但这确实为您提供了一些优势,因为现在您可以确保(通过向IAccountRemovalService添加新成员)拥有RemoveAccount方法的服务实现在其实现方法上保持锁步。

一个小注释,由于后缀CurrentServiceEnum,因此您要打开的属性Enum并不正确,这可能是考虑删除的原因-但这只是我的选择! =)