Я играю с API Harvest, и я пытаюсь автоматически сопоставить объекты как можно проще, к сожалению, когда я делаю запрос типа GET /projects
, он генерирует такой результат:
[{
project: {
name: "Test"
}
},
{
project: {
name: "Test 2"
}]
В RestSharp я не могу напрямую это сделать:
client.Execute<List<Project>>(request)
Потому что он будет искать свойство под названием Project
. Поэтому я должен создать другой класс, обладающий этим свойством, и называть его следующим образом:
client.Execute<List<ProjectContainer>>(request)
Я не хочу создавать класс "контейнера" для каждого объекта, поэтому я решил, что нашел умное решение, чтобы сделать один класс, который я могу использовать для всех:
public class ListContainer<T> where T : IHarvestEntity
{
public T Item { get; set; }
}
Но, конечно, десериализатор понятия не имеет, что ему нужно сопоставить имя объекта (или "Проект" ) с свойством Item
. В документации restsharp я обнаружил, что могу использовать [DeserializeAs(Name = "CustomProperty")]
, чтобы сообщить десериализатору, какое поле будет отображено для этого свойства. Однако атрибуты допускают только константы, что означает, что я не могу:
[DeserializeAs(Name = typeof(T).FullName)]
public T Item { get; set; }
Кто-нибудь знает умное решение? Так что мне не нужно создавать 10 различных классов контейнеров?