转换对象类型

时间:2016-05-10 23:01:22

标签: c#

我有一个基类:

public class BaseResponse
{
        public int StatusCode { get; set; }
        public string ErrorMessage { get; set; }
        public int ErrorCode { get; set; }
}

然后我有从基类派生的类:

public class AddAccountResponse : BaseResponse
{
        public string AcctNum { get; set; }
}

public class AddCustomerResponse : BaseResponse
{
        public string FullName { get; set; }
}

发生错误时,我有一个返回BaseResponse的方法。

将响应从基础转换/转换为预期结果类型的最佳方法是什么?例如:

public AddCustomerResponse PleaseAddMyCustomer(CustomerRequest customerReq)
{
    AddCustomerResponse response;

    if (restResponse.StatusCode != HttpStatusCode.OK)
    {
        ...
        BaseResponse base = GetErrorResponse(restResponse);
        return (response.GetType(response))base; <-----
    }
}

我知道我可以:

response = new AddAccountResponse() 
    { 
        StatusCode = base.StatusCode
        ...
    }
return response;

请原谅我的愚蠢/相当愚蠢的例子,但我想创建一个基本的例子。

2 个答案:

答案 0 :(得分:0)

您可以使用泛型。我创建了一个小程序来演示:

using System;
using System.Text.RegularExpressions;

public class Program
{
    public static void Main()
    {
        string restResponse = "OK";

        // Creates an AddAccountResponse
        var response = GetResponse<AddAccountResponse>(restResponse);
        response.AccountNumber = 0;
    }

    // I converted your `GetResponse` to a generic method `GetResponse<T>`. 
    // The method expects that `T` is (derived from) a `BaseResponse` 
    // and that `T` has a parameterless constructor. 
    private static T GetResponse<T>(string restResponse) where T : BaseResponse, new()
    {
        var response = new T();
        response.StatusCode = restResponse;
        return response;        
    }
}

public class BaseResponse
{
    public string StatusCode { get; set; }
}

public class AddAccountResponse : BaseResponse
{
    public int AccountNumber { get; set; }
}

为了演示目的,它有点简化,但我想你明白了。

答案 1 :(得分:0)

我不清楚你要在这里完成什么。如果没有泛型,则需要为类似的行为定义公共接口。

这是你想要的吗?

class Program
{
    static void Main(string[] args)
    {
        List<IBaseEntity> entities=new List<IBaseEntity>();
        IBaseEntity acct=new Account() { AcctNum="1001-Q" };
        entities.Add(acct);
        IBaseEntity cust=new Customer() { FullName="Draco Malfoy" };
        entities.Add(cust);

        List<BaseResponse> responces=new List<BaseResponse>();
        responces.Add(cust.GetResponce());
        responces.Add(acct.GetResponce());

        foreach (var item in responces.OfType<AddCustomerResponse>())
        {
            Console.WriteLine(item.FullName);
        }
        foreach (var item in responces.OfType<AddAccountResponse>())
        {
            Console.WriteLine(item.AcctNum);
        }
    }
}

具有以下定义:

public class BaseResponse
{
    public int StatusCode { get; set; }
    public string ErrorMessage { get; set; }
    public int ErrorCode { get; set; }
}

public class AddAccountResponse : BaseResponse
{
    public string AcctNum { get; set; }
}

public class AddCustomerResponse : BaseResponse
{
    public string FullName { get; set; }
}

public interface IBaseEntity
{
    BaseResponse GetResponce();
}

public class Customer : IBaseEntity
{
    public string FullName { get; set; }
    public AddCustomerResponse GetResponce()
    {
        return new AddCustomerResponse()
        {
            FullName=this.FullName
        };
    }
}

public class Account : IBaseEntity
{
    public string AcctNum { get; set; }
    public AddAccountResponse GetResponce()
    {
        return new AddAccountResponse()
        {
            AcctNum=this.AcctNum
        };
    }
}