2012-11-29 3 views
5

MVC WebApi 컨트롤러에 전달하는 동적 객체 (실제로 json 임)가 있습니다.동적 익명 객체 (C#) 내의 객체 개수

json 개체에는 client.PostAsJsonAsync("myapiurl", objectGraph)을 통해 다른 응용 프로그램에서 컨트롤러로 전송되는 익명 개체의 여러 목록이 포함되어 있습니다.

MVC 측에서 객체의 유효성을 검사하려면 각 목록의 객체 수를 가져와야합니다. mydynamicobject.mylist[index]을 통해 mydynamicobject.mylist 및 개별 항목을 통해 목록에 동적으로 액세스 할 수 있지만 mydynamicobject.mylist 수를 얻을 수없는 것으로 보입니다.

지금까지 시도했습니다 무엇 :

  • LINQ 확장 방법 -
  • Enumerable.Count(mydynamicobject.mylist) 동적
  • 작동하지 않습니다 - 유형

다른 아이디어를 추론 할 수없는 이유는 무엇입니까? 실제로 동적 개체의 base에서 정확하게 사용할 수 있지만 속성으로는 액세스 할 수 없습니다. 도움!

이 이제 작동합니다

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

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

동적 객체 (다른 응용 프로그램)을 보내는 코드 :

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

'mydynamicobject.mylist'는 언제 컴파일 시점이나 실행 시간에 실패합니까? –

+0

동적 개체 내의 목록 개수에만 접근 할 수 없습니다. 실패는 내가 시도하는 것에 달려있다. Enumerable.Count는 형식을 유추하거나 명시 적으로 지정할 수 없다고합니다. – Alex

+0

죄송합니다, 나는'Enumerable.Count'과 관련이 있습니다 - 실행 시간이나 컴파일 타임의 오류입니까? 'mydynamicobject.mylist'의 실행 시간 타입은 무엇입니까? –

답변

11

가 배열 인 경우, 당신이 자신의 Length 재산을 찾고 생각합니다. 파올로가 언급 한 바와 같이 당신은 또한 이 할 수있는

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

: 또는

mydynamicobject.mylist.Length 

, 난 당신과 같이 IEnueramble.CountIEnumerablemydynamicobject.mylist을 주조로 도망 한 다음 손으로 할 수있을 것 같아요 :

((ICollection)mydynamicobject.mylist).Count 

나는 그 중 하나를 인정하지 않지만.

+1

당신은'ICollection.Count'을 의미합니다 –

+0

@PaoloMoretti 감사합니다. 수정. – Crisfole

+0

죄송합니다. 충분히 명확하지 않았습니다. 'ICollection'으로 캐스트 한 다음 [ICollection.Count'] (http://msdn.microsoft.com/en-us/library/system.collections.icollection.count.aspx)를 확인하거나 또는 'IEnumerable'로 캐스팅하고 LINQ 확장 메서드 [Enumerable.Count']를 사용하십시오 (http://msdn.microsoft.com/en-us/library/bb535181.aspx) –