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

Dud*_*tag 0 c# linq json

我正在构建一个连接到客户端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;
    }
}
Run Code Online (Sandbox Code Playgroud)

if语句中还有其他代码(它实际上是错误处理的if-else),但它与这个问题并不真正相关.我在多种方法中使用相同的代码,唯一的区别是它返回List<Bagel>,或者List<Cruller>等等...我想要做的是将此代码提取到它自己的方法中,但我不确定如何.现在,我正在尝试反序列化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")();
}
Run Code Online (Sandbox Code Playgroud)

我的Intellisense告诉我"无法从用法中推断出方法'MODULE.Index(string)'的类型参数.请尝试明确指定类型参数".我尝试像这样投射:(列表)MakeCall.Index("甜甜圈")(); 但这没有成功.有没有办法强制转换,以便我可以使用GetDonuts,GetCrullers等方法...所有人都有效地调用Index?

Mat*_*and 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Bascially替换所有引用DonutT.

据推测,端点地址会发生变化,因此您可以将其添加为参数.

打这样的话:

var donuts = GetStuff<Donut>("http://dunkin.com/api/allthedonuts");
Run Code Online (Sandbox Code Playgroud)