从通用方法中的object[]获取List<T>

问题描述 投票:0回答:1

我正在尝试编写一种方法,将任何类型的分页 API 调用的所有结果收集到一个列表中。到目前为止我的方法看起来像这样...

        private async Task<List<T>> AggregateResults<T>(string url)
        {
            var results = new List<T>();

            var morePages = true;
            while (morePages)
            {
                var response = await _httpClient.GetAsync(url);
                var responseContent = await response.Content.ReadAsStringAsync();
                var result = JsonConvert.DeserializeObject<PaginatedResult>(responseContent);

                results.AddRange(result.results.Cast<T>().ToList());

                if (result.paging != null)
                {
                    url = result.paging.next.link;
                }
                else
                {
                    morePages = false;
                }
            }
            return results;
        }

分页结果类看起来像这样

{
    public class PaginatedResult
    {
        public object[] results { get; set; }
        public Paging? paging { get; set; }
    }

    public class Paging
    {
        public Next next { get; set; }
    }

    public class Next
    {
        public string after { get; set; }
        public string link { get; set; }
    }
}

我将这样的东西作为该方法的泛型传递

public class Person
{
    public string Name { get; set; }
    public DateTime DateOfBirth { get; set; }
}

public class Car
{
    public string Make { get; set; }
    public string Model { get; set; }
}

我现在收到此错误

'Unable to cast object of type 'Newtonsoft.Json.Linq.JObject' to type 
。 有什么方法可以从这里的 object[] 获取列表吗?

我尝试过以任何我能找到的方式来转换数组,但总是遇到错误。我考虑过在我的类中继承

PaginatedResult
,我试图将其放入列表中,但无法理解它如何工作或是否会工作。

c# arrays list generics
1个回答
0
投票

尝试将

PaginatedResult
设为泛型类
PaginatedResult<T>
,并将结果类型从
object[]
更改为
T[]

using Newtonsoft.Json;

namespace ConsoleApp1
{
    internal class Program
    {
        static void Main(string[] args)
        {
            const string j = """
{
    "results": [
        { "name": "a", "DateOfBirth": "2000/01/01" },
        { "name": "b", "DateOfBirth": "2000/01/01" },
    ],
    "paging" : {
        "next": {
            "after": "...",
            "link": "..."
        }
    }
}
""";
            var res = JsonConvert.DeserializeObject<PaginatedResult<Person>>(j);
            Console.WriteLine(res.results[0].Name);
        }

        public class PaginatedResult<T>
        {
            public T[] results { get; set; }
            public Paging? paging { get; set; }
        }

        public class Paging
        {
            public Next next { get; set; }
        }

        public class Next
        {
            public string after { get; set; }
            public string link { get; set; }
        }
        public class Person
        {
            public string Name { get; set; }
            public DateTime DateOfBirth { get; set; }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.