2012-11-29 13 views
5

Mam obiekt dynamiczny (to w rzeczywistości json), który przekazuję do kontrolera MVC WebApi.Policz obiekty w obrębie dynamicznego obiektu anonimowego (C#)

Obiekt json zawiera wiele list wewnątrz anonimowego obiektu, które są przesyłane do kontrolera z innej aplikacji za pośrednictwem client.PostAsJsonAsync("myapiurl", objectGraph).

Co muszę zrobić, aby sprawdzić obiekt po stronie MVC, to uzyskać liczbę obiektów na każdej liście. Mogę uzyskać dostęp do list dynamicznie za pośrednictwem mydynamicobject.mylist i poszczególnych przedmiotów przez mydynamicobject.mylist[index], ale nie mogę uzyskać liczby mydynamicobject.mylist.

Co próbowałem dotąd: rozszerzenie metod

  • LINQ - nie działa na dynamicznym
  • Enumerable.Count(mydynamicobject.mylist) - nie można wywnioskować typu

jakieś inne pomysły? Liczba jest właściwie dostępna w obiekcie dynamicznym base, ale oczywiście nie jest dostępna jako właściwość. Wsparcie!

Działa to teraz:

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

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

Kod, który wysyła dynamiczny obiekt (inną aplikację):

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

W którym momencie 'mydynamicobject.mylist' kończy się niepowodzeniem - czas kompilacji lub czas wykonania? –

+0

Nie mogę uzyskać tylko liczby na liście wewnątrz dynamicznego obiektu. Awaria zależy od tego, co próbuję. Enumerable.Count powie, że nie może wywnioskować typu i jawnie go określić. – Alex

+0

Przepraszam, miałem na myśli z 'Enumerable.Count' - jest błąd w czasie wykonywania, lub czas kompilacji? Co to jest * typ wykonania czasu 'mydynamicobject.mylist'? –

Odpowiedz

11

Jeśli są tablice, wierzę szukasz ich Length nieruchomości.

mydynamicobject.mylist.Length 

Alternatywnie, myślę, że może być w stanie uciec z odlewania mydynamicobject.mylist do IEnumerable a następnie przekazać je do IEnueramble.Count tak:

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

można również zrobić jak wspomniano Paolo:

((ICollection)mydynamicobject.mylist).Count 

Chociaż nie mogę wziąć kredytu za ten.

+1

Masz na myśli 'ICollection.Count' –

+0

@PaoloMoretti Dzięki. Korygowanie. – Crisfole

+0

Przykro mi, nie byłem wystarczająco jasny. Możesz spróbować przesłać go do 'ICollection', a następnie sprawdzić [' ICollection.Count'] (http://msdn.microsoft.com/en-us/library/system.collections.icollection.count.aspx), lub przesłać go do 'IEnumerable' i użyć metody rozszerzenia LINQ [' Enumerable.Count'] (http://msdn.microsoft.com/en-us/library/bb535181.aspx) –

Powiązane problemy