C# 如何转换列表<;对象>;列出<;CustomClass>;?
我正在构建一个类库,它连接到客户机的API,并将来自给定端点的响应收集到一个类中。换句话说,我将点击客户端的Donuts端点,并使用JsonConvert将响应反序列化到我的Donuts类中,该类具有与JSON对象中的属性匹配的字段。这一切都很好,但它们有很多端点,我有许多方法反复重复相同的代码。考虑到干性和关注点的分离,我希望有一个单独的名称空间来进行rest调用,不管端点是什么,并将正确的结果返回给主类。下面是一个示例,说明它现在的功能(我使用RestSharp配置请求和响应):C# 如何转换列表<;对象>;列出<;CustomClass>;?,c#,json,linq,C#,Json,Linq,我正在构建一个类库,它连接到客户机的API,并将来自给定端点的响应收集到一个类中。换句话说,我将点击客户端的Donuts端点,并使用JsonConvert将响应反序列化到我的Donuts类中,该类具有与JSON对象中的属性匹配的字段。这一切都很好,但它们有很多端点,我有许多方法反复重复相同的代码。考虑到干性和关注点的分离,我希望有一个单独的名称空间来进行rest调用,不管端点是什么,并将正确的结果返回给主类。下面是一个示例,说明它现在的功能(我使用RestSharp配置请求和响应): 公共列表索
公共列表索引(字符串端点)
{
列表结果=新列表();
RestClient=newrestclient();
RestRequest Req=ConfigureGetRequest(端点);
IRestResponse Resp=客户端执行(Req);
if(Resp.StatusCode==System.Net.HttpStatusCode.OK)
{
结果=JsonConvert.DeserializeObject(分别为内容、反序列化设置);
}
返回结果;
}
}
if语句中还有其他代码(它实际上是用于错误处理的if-else),但它与这个问题并不相关。我在多个方法中有相同的代码,唯一的区别是它返回List
,或List
,等等。。。我想做的是将这段代码提取到它自己的方法中,但我不确定如何提取。现在,我正试图反序列化为List
,然后稍后将其转换为List
,但我似乎无能为力。我的另一个想法是将端点名称作为参数传递(public List GetDonuts(string endpoint)
),然后以某种方式使用它来确定要反序列化为哪种类型的对象,如果这样做有意义的话?不管怎样,如果有人对这样做的好方法有任何见解,我们将不胜感激
编辑
非常棒的回答,谢谢大家。我已经根据Matt Dillard下面的答案重构了方法。下一步是将列表转换为列表。调用上述方法的方法如下所示:
public List<Donut> GetDonuts()
{
List<Donut> Results = new List<Donut>();
MODULE MakeCall = new GET();
return Results = MakeCall.Index("donuts")();
}
var donuts = GetStuff<Donut>("http://dunkin.com/api/allthedonuts");
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;
}
public List GetDonuts()
{
列表结果=新列表();
模块MakeCall=new GET();
返回结果=MakeCall.Index(“甜甜圈”)();
}
我的Intellisense告诉我“无法从用法中推断方法'MODULE.Index(string)'的类型参数。请尝试显式指定类型参数”。我试着这样做:(List)MakeCall.Index(“甜甜圈”)();
但那没有成功。有没有一种方法可以将其转换为GetDonuts、getCruler等方法。。。所有的调用索引都有效吗?您可能希望将其作为通用方法,接受类型
T
,并返回类似的列表
public List<T> GetDonuts<T>() where T : class, new()
{
public List GetDonuts(),其中T:class,new()
{
泛型:
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;
}
}
我知道需要做什么。我不能反序列化泛型列表,但我可以反序列化泛型,并将其放入列表中。最终代码如下所示:
public List<Donut> GetDonuts()
{
List<Donut> Results = new List<Donut>();
MODULE MakeCall = new GET();
return Results = MakeCall.Index("donuts")();
}
var donuts = GetStuff<Donut>("http://dunkin.com/api/allthedonuts");
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;
}
public List GetDonuts()
{
GET MakeCall=new GET();
列表结果=新列表();
结果=MakeCall.Index();
返回结果;
}
公共列表索引()
{
T结果;
列表结果列表=新列表();
RestClient=newrestclient();
RestRequest Req=ConfigureGetRequest(端点);
IRestResponse Resp=客户端执行(Req);
if(Resp.StatusCode==System.Net.HttpStatusCode.OK)
{
结果=JsonConvert.DeserializeObject(分别为内容、反序列化设置);
结果列表。添加(结果);
}
返回结果列表;
}
这让我可以使用GetDonuts、GetCruiller等来保持精干。感谢所有的帮助!如果你有一个
列表,那就是代码味道。泛型可能是解决方法。然后你可以做类似列表甜甜圈=GetStuff();列表蛋糕=GetStuff()的事情;
您还需要将添加到方法中,以允许他传递类型。var donuts=GetStuff();@Cory:Whoops。错过了。