如何将List <object>转换为List <customclass>?

时间:2017-06-15 15:49:54

标签: c# json linq

我正在构建一个连接到客户端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?

3 个答案:

答案 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等......精益和干。谢谢你的帮助!