Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何转换列表<;对象>;列出<;CustomClass>;?_C#_Json_Linq - Fatal编程技术网

C# 如何转换列表<;对象>;列出<;CustomClass>;?

C# 如何转换列表<;对象>;列出<;CustomClass>;?,c#,json,linq,C#,Json,Linq,我正在构建一个类库,它连接到客户机的API,并将来自给定端点的响应收集到一个类中。换句话说,我将点击客户端的Donuts端点,并使用JsonConvert将响应反序列化到我的Donuts类中,该类具有与JSON对象中的属性匹配的字段。这一切都很好,但它们有很多端点,我有许多方法反复重复相同的代码。考虑到干性和关注点的分离,我希望有一个单独的名称空间来进行rest调用,不管端点是什么,并将正确的结果返回给主类。下面是一个示例,说明它现在的功能(我使用RestSharp配置请求和响应): 公共列表索

我正在构建一个类库,它连接到客户机的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。错过了。