2016-05-10 118 views
1

我有一个基类:转换对象类型

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; 

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

+0

如果你希望一个静态类型只投给'typeof运算(ThatType)'。如果你想要一个动态类型是另一个问题。 – BlargleMonster

+2

如果您问如何将基类转换为派生类,则可以使用['is'和'as'关键字](https://msdn.microsoft.com/zh-cn/library/cc488006。 ASPX)。 – Kupiakos

+0

好吧,我会有多种方法,我试图弄清楚if(restResponse.StatusCode!= HttpStatusCode.OK) {}之间的代码如果不在响应类型中,它们可以保持相同和基本相同。在一种方法中,响应是AddCustomerResponse,另一种是AddAccountResponse。 – ginalster

回答

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; } 
} 

这是一个简单的演示目的,但我想你明白了。

+0

谢谢,我会在周末看看它。这是我想我正在寻找的东西。 – ginalster

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 
     }; 
    } 
}