2016-05-10 140 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 
     }; 
    } 
}