2012-11-29 7 views
5

Ho un oggetto dinamico (in realtà JSON) che passo al controller MVC WebApi.Contare gli oggetti all'interno dell'oggetto dinamico anonimo (C#)

L'oggetto json contiene più elenchi all'interno di un oggetto anonimo che vengono inviati al controller da un'altra applicazione tramite client.PostAsJsonAsync("myapiurl", objectGraph).

Quello che devo fare per convalidare l'oggetto sul lato MVC, è ottenere il conteggio degli oggetti in ogni lista. Posso accedere agli elenchi dinamicamente tramite mydynamicobject.mylist e singoli articoli tramite mydynamicobject.mylist[index] ma non riesco a ottenere un conteggio di mydynamicobject.mylist.

Quello che ho provato finora: i metodi di estensione

  • LINQ - non funziona su dinamica
  • Enumerable.Count(mydynamicobject.mylist) - non può inferire tipo

Altre idee? Il conteggio è effettivamente disponibile correttamente nell'oggetto dinamico base ma ovviamente non accessibile come proprietà. Aiuto!

Questo funziona ora:

// This is a MVC/WebApi method 
public dynamic Post(dynamic mydynamicobject) 

if (((ICollection)mydynamicobject.mylist).Count == 0) 
{ 
// do something 
} 

Il codice che invia l'oggetto dinamico (diversa app):

HttpClient client = new HttpClient(); 
client.DefaultRequestHeaders.Accept.Add 
    (new MediaTypeWithQualityHeaderValue("application/json")); 

var objectGraph = new { mylist = new { Id = 1 }, mylist2 = new { Name = "ABC" } }; 
var r = client.PostAsJsonAsync("api/mycontroller", objectGraph).Result; 
+1

A che punto 'mydynamicobject.mylist' non riesce - tempo di compilazione o tempo di esecuzione? –

+0

Non riesco ad arrivare al conteggio della lista all'interno dell'oggetto dinamico. Il fallimento dipende da quello che cerco. Enumerable.Count dirà che non può inferire il tipo e specificarlo esplicitamente. – Alex

+0

Mi spiace, intendevo con 'Enumerable.Count' - l'errore in fase di esecuzione o di compilazione? Che cosa * è * il tipo di tempo di esecuzione di 'mydynamicobject.mylist'? –

risposta

11

Se sono le matrici, credo che siete in cerca di loro proprietà Length.

mydynamicobject.mylist.Length 

In alternativa, penso che si potrebbe essere in grado di cavarsela con colata mydynamicobject.mylist a un IEnumerable e poi mano a IEnueramble.Count in questo modo:

IEnumerable.Count((IEnumerable)mydynamicobject.mylist); 

si potrebbe anche fare come detto Paolo:

((ICollection)mydynamicobject.mylist).Count 

Anche se non posso prendermi il merito di quello.

+1

Intendi 'ICollection.Count' –

+0

@PaoloMoretti Grazie. Correzione. – Crisfole

+0

Mi dispiace, non ero abbastanza chiaro. Puoi provare a lanciarlo su 'ICollection' e quindi cercare [' ICollection.Count'] (http://msdn.microsoft.com/en-us/library/system.collections.icollection.count.aspx), o lanciarlo su "IEnumerable" e utilizzare il metodo di estensione LINQ ['Enumerable.Count'] (http://msdn.microsoft.com/en-us/library/bb535181.aspx) –

Problemi correlati