sto giocando con l'API di vendemmia e sto cercando di mappare automaticamente i soggetti più semplice possibile, purtroppo quando faccio una richiesta simile GET /projects
genera un risultato in questo modo:dinamicamente deserializzazione di un immobile in RestSharp
[{
project: {
name: "Test"
}
},
{
project: {
name: "Test 2"
}]
In RestSharp, non posso fare direttamente questa:
client.Execute<List<Project>>(request)
perché sta andando a cercare una proprietà chiamata Project
. Quindi devo fare un'altra classe che ha quella proprietà, e lo chiamo così:
client.Execute<List<ProjectContainer>>(request)
Non voglio fare una classe di 'contenitore' per ogni entità, così ho pensato che ho trovato una soluzione intelligente per fare una classe che posso usare su tutti:
public class ListContainer<T> where T : IHarvestEntity
{
public T Item { get; set; }
}
Ma, naturalmente, il deserializzatore non ha alcuna idea di cui ha bisogno per mappare il nome dell'entità (o "Progetto") per la proprietà Item
. Nella documentazione di restsharp ho scoperto che potevo usare [DeserializeAs(Name = "CustomProperty")]
per dire al deserializzatore quale campo mappare a questa proprietà. Tuttavia, gli attributi consentono solo costanti, il che significa che non posso fare:
[DeserializeAs(Name = typeof(T).FullName)]
public T Item { get; set; }
Qualcuno sa una soluzione intelligente a questo? Quindi non devo creare 10 diverse classi di contenitori?
oggetto dinamico è probabilmente la risposta alla domanda, ma un sacco di sviluppatori ti avvertirei di implementare semplicemente le classi XYZModel e usarle; ottieni tutti i vantaggi e le garanzie del tuo compilatore e non rischi (la stessa classe di) eccezioni di run-time. –
Democraticamente penso che dovrei darti la taglia, ma sento che la risposta di Mikko risponde più correttamente alla mia situazione. Perché nel tuo esempio, perdo la mappatura automatica all'entità che è l'idea alla base di questo. Mi sbaglio di questo? – Chris
La mappatura su un oggetto è possibile, usando l'oggetto progetto dalla risposta di Mikko: var project = new Project (o.SelectToken ("project"). SelectToken ("name"). Value) –