如何返回可能来自两种不同类型的通用对象

时间:2015-04-29 17:09:22

标签: c# .net generics types

我正在尝试创建一个中间层,允许我连接到Live服务或测试服务,而无需更改我的客户端。

我需要返回一个名为Product的通用对象,以便在客户端中使用。我从中间层得到这个,但我不需要知道我是如何得到这个或它来自哪里。中间层连接到实时和测试服务,我只是调用一个方法来获取我需要的东西。

问题是将我从任何服务中获得的产品返回给客户端。该方法期待Product,但它正在尝试发送LiveService.ProductTestService.Product

有没有办法将这些类型转换为通用Product类型,以便将它们返回给客户端?

以下是我目前创建的内容。

客户

Connection conn = new Connection("Test");
IServiceImplementation service = conn.GetServiceImplementation();
Product prod = service.GetProductUsingId(123);

中间层

public interface IServiceImplementation
{
    Product GetProductUsingId (int productID);
}

public class Connection
{
    private string mode;

    public Connection(string _Mode)
    {
        mode = _Mode;
    }

    public IServiceImplementation GetServiceImplementation()
    {
        if (mode == "Live")
        {
            return new LiveService();
        }
        else if (mode == "Test")
        {
            return new TestService();
        }
        else
        {
            return null;
        }
    }
}

Public class LiveService : IServiceImplementation
{
    public Product GetProductUsingId (int productID)
    {
        LiveService.Service live = new LiveService.Service();
        return live.GetProduct(2638975);
    }
}

Public class TestService : IServiceImplementation
{
    public Product GetProductUsingId (int productID)
    {
        TestService.Service test = new TestService.Service();
        return test.GetProduct(2638975);
    }
}

1 个答案:

答案 0 :(得分:0)

如您所见,Product,LiveService.Product和TestService.Product是三种不同的类型,无法相互转换。

如果您无法安排使用相同的类型,或者LiveService.Product和TestService.Product要继承Product,那么您的下一个选项是将属性从Live(Test)Service.Product复制到Product。 / p>

在我的示例中,我使用AutoMapper将属性值从Live(Test)Service.Product复制到Product。

值得一提的是,这些是三种不同的类型,如果三种类型中任何一种的任何属性发生变化,都可能导致问题。使用AutoMapper,任何不匹配的属性名称都将无法复制,而不会显示任何错误。这可能会导致您忽略未传递属性值的事实。

public IServiceImplementation GetServiceImplementation()
{
    if (mode == "Live")
    {
        return new LiveServiceImplementation();
    }
    else if (mode == "Test")
    {
        return new TestServiceImplementation();
    }
    else
    {
        return null;
    }
}

public class LiveServiceImplementation : IServiceImplementation
{
    public LiveServiceImplementation()
    {
        Mapper.CreateMap<LiveService.Product, Product>();
    }

    public Product GetProductUsingId(int productID)
    {
        LiveService.Service _service = new LiveService.Service();
        return Mapper.Map<LiveService.Product, Product>(_service.GetProduct(2638975));
    }
}

public class TestServiceImplementation : IServiceImplementation
{
    public TestServiceImplementation()
    {
        Mapper.CreateMap<TestService.Product, Product>();
    }

    public Product GetProductUsingId(int productID)
    {
        TestService.Service _service = new TestService.Service();
        return Mapper.Map<TestService.Product, Product>(_service.GetProduct(2638975));
    }
}