2017-06-15 233 views
0

我正在構建一個連接到客戶端API的類庫,並將給定端點的響應收集到一個類中。換句話說,我將打到客戶端的Donuts端點,並使用JsonConvert將響應反序列化到我的Donuts類中,該類具有與JSON對象中的屬性相匹配的字段。這一切都很好,但它們有很多終結點,並且我有許多重複相同代碼的方法。爲了干涉和分離問題,我希望有一個獨立的命名空間,使剩下的呼叫,無論端點,並將正確的結果返回到主類。下面是它現在做什麼(我使用RestSharp配置請求和響應)的例子:如何將List <object>轉換爲列表<CustomClass>?

public List<T> Index<T>(string Endpoint) 
    { 
     List<T> Results = new List<T>(); 
     RestClient Client = new RestClient(); 
     RestRequest Req = ConfigureGetRequest(Endpoint); 
     IRestResponse Resp = Client.Execute(Req); 

     if (Resp.StatusCode == System.Net.HttpStatusCode.OK) 
     { 
      Results = JsonConvert.DeserializeObject<List<T>>(Resp.Content, DeserializationSettings); 
     } 
     return Results; 
    } 
} 

有if語句其他代碼(它實際上是一個if-else的錯誤處理),但它的與這個問題無關。我有多個方法相同的代碼,唯一的區別是它返回List<Bagel>List<Cruller>,等等...我想要做的是將此代碼提取到它自己的方法,但我不知道如何。現在,我試圖反序列化到List<object>,然後將其轉換爲List<Donut>,但這似乎不是我能做的事。我的另一個想法是傳遞端點名稱作爲參數(public List<Donut> GetDonuts(string Endpoint)),然後以某種方式使用它來確定要反序列化的對象的類型,如果有意義的話? Anyhoo,如果任何人有一個很好的方式來做到這一點,將不勝感激!

編輯

真棒回覆,謝謝你們。我根據馬特迪拉德的答案重構了這個方法。下一步是將列表轉換爲列表。調用該方法上面的方法是這樣的:

public List<Donut> GetDonuts() 
{ 
    List<Donut> Results = new List<Donut>(); 
    MODULE MakeCall = new GET(); 
    return Results = MakeCall.Index("donuts")(); 
} 

我的智能感知告訴我「的類型參數的方法‘MODULE.Index(串)’不能從使用推斷嘗試指定類型參數明確。 」。我嘗試像這樣鑄造:(List)MakeCall.Index(「donuts」)(); 但這並沒有解決。有沒有一種方法可以讓我可以擁有方法GetDonuts,GetCrullers等等,它們都可以有效地調用Index?

+1

如果你有一個'列表',這是一種代碼異味。泛型可能是修復。然後你可以做一些事情,比如'List donuts = GetStuff ();列表 cakes = GetStuff ();' – mason

回答

0

我想通了,什麼需要發生。我無法反序列化一個通用列表,但是我可以反序列化一個通用列表,並將其放入列表中。最終的代碼如下所示:

public List<Donut> GetDonuts<T>() 
{ 
    GET MakeCall = new GET(); 
    List<Donut> Results = new List<Donut>(); 
    Results = MakeCall.Index<Donut>(); 
    return Results; 
} 

public List<T> Index<T>() 
{ 
    T Result; 
    List<T> ResultList = new List<T>(); 
    RestClient Client = new RestClient(); 
    RestRequest Req = ConfigureGetRequest(Endpoint); 
    IRestResponse Resp = Client.Execute(Req); 

    if (Resp.StatusCode == System.Net.HttpStatusCode.OK) 
    { 
     Result = JsonConvert.DeserializeObject<T>(Resp.Content, DeserializationSettings); 
     ResultList.Add(Result); 
    } 
    return ResultList; 
} 

這允許我使用GetDonuts,GetCrullers等..爲稀,乾燥。感謝所有的幫助!

4

你可能會想擁有它作爲接受型T並返回諸如此類

public List<T> GetDonuts<T>() where T : class, new() 
    { 
6

泛型列表泛型方法:

public List<T> GetStuff<T>(string endpoint) 
{ 
     List<T> Results = new List<T>(); 
     RestClient Client = new RestClient(); 
     RestRequest Req = ConfigureGetRequest(endpoint); 
     IRestResponse Resp = Client.Execute(Req); 

     if (Resp.StatusCode == System.Net.HttpStatusCode.OK) 
     { 
      Results = JsonConvert.DeserializeObject<List<T>>(Resp.Content, DeserializationSettings); 
     } 
     return Results; 
    } 
} 

Bascially與T替換所有引用Donut

假定端點地址會改變,所以你可以添加它作爲參數。

呼叫是這樣的:

var donuts = GetStuff<Donut>("http://dunkin.com/api/allthedonuts"); 
+0

您也可以將添加到該方法中,以允許他傳遞該類型。 var donuts = GetStuff (); – Cory

+0

@Cory:哎呀。錯過了。 –

相關問題