我正在构建一个连接到客户端API的类库,并将来自给定端点的响应收集到一个类中。换句话说,我将点击客户端的Donuts端点,并使用JsonConvert将响应反序列化到我的Donuts类中,该类具有与JSON对象中的属性匹配的字段。这一切都很好,但它们有很多端点,我有很多方法一遍又一遍地重复相同的代码。为了DRYness和关注点的分离,我希望有一个单独的命名空间,无论端点如何,都会进行其余的调用,并将正确的结果返回给主类。以下是它现在所做的一个例子(我使用RestSharp来配置请求和响应):
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>
等等...我想要做的是将此代码提取到其中&# 39;自己的方法,但我不确定如何。现在,我尝试反序列化为List<object>
,然后将其转换为List<Donut>
,但这似乎不是我能做的事情。我的另一个想法是将端点名称作为参数传递(public List<Donut> GetDonuts(string Endpoint)
),然后以某种方式使用它来确定要反序列化的对象类型,如果这有意义的话? Anyhoo,如果有人对这样做的好方法有任何见解,我们将不胜感激!
修改
非常棒的回复,谢谢大家。我根据Matt Dillard的答案重构了这个方法。下一步是将List转换为List。调用上述方法的方法如下所示:
public List<Donut> GetDonuts()
{
List<Donut> Results = new List<Donut>();
MODULE MakeCall = new GET();
return Results = MakeCall.Index("donuts")();
}
我的Intellisense告诉我&#34;方法的类型参数&#39; MODULE.Index(string)&#39;无法从使用中推断出来。尝试明确指定类型参数&#34;。我尝试像这样投射:(列表)MakeCall.Index(&#34;甜甜圈&#34;)(); 但那并没有成功。有没有办法强制转换,以便我可以有方法GetDonuts,GetCrullers等...所有人都有效地调用Index?
答案 0 :(得分: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;
}
}
基本上将所有对Donut
的引用替换为T
。
推测端点地址会发生变化,因此您可以将其添加为参数。
请拨打以下内容:
var donuts = GetStuff<Donut>("http://dunkin.com/api/allthedonuts");
答案 1 :(得分:4)
您可能希望将其作为接受类型<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<table>
<thead>
<tr>
<th data-cid="Col_18">sadf</th>
<th data-cid="Col_17">asdf</th>
</tr>
</thead>
<tbody>
<tr>
<td data-cid="Col_18">sadf</td>
<td data-cid="Col_17">sadf</td>
</tr>
</tbody>
</table>
的通用方法并返回类似的列表
T
答案 2 :(得分: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等......精益和干。谢谢你的帮助!