2016-08-18 1 views
1

제 3 자로부터 반환하는 객체가 있으므로 동적이어야합니다. 아래의 IEnumerable 요구 사항). 모든 자식 노드가있는 Json 객체를 반환하고 싶습니다.모든 자식 노드가있는 동적 객체를 Json으로 반환합니다. 오류 : 람다 식을 동적으로 전달하는 인수로 사용할 수 없습니다.

나는 두 가지 질문

  1. 나는 동적 객체의 ALL 기타 사항 서보 -OFF (c.Nodes가) (갈 방법이 입니까?) 할 수있는 방법을
  2. 어떻게 내가 통해 반복 유지할 수 있습니다 완료 될 때까지 노드.

이 내가 지금까지 쓴 코드입니다하지만 지금 .Select(c =>... 오류를주고있다

cannot use a lambda expression as an argument to a dynamically dispatched...

IEnumerable<dynamic> requirements = _Requirements.GetRequirements(); 
    return Json(new 
     { 
      Requirements = requirements.Select(r => new 
       { 
        r.Text, 
        r.Number, 
        nodes = r.nodes.Select(c => new 
         { 
          c.Text, 
          c.Number, 
          nodes = c.Nodes 
          //and overhere keep looping through the nodes until it's done 
         }) 
       }) 
     }); 
+0

가 왜'JSON (새 {요구 사항 = 요구 사항을}) 반환 할 수 없습니다'? –

+0

@GiladGreen에는 각각 컬렉션이 있습니다 (최대 4 번). 그것은 각 노드에서 .select를해야한다는 것을 의미합니까 (4 번)? 감사합니다 – shw

+0

가능한 대리자 또는 표현식 트리 형식으로 캐스팅하지 않고 동적으로 디스패치 된 연산에 대한 인수로 람다 식을 사용할 수 없습니다 (http://stackoverflow.com/questions/27169521/cannot-use-a) -lambda-expression-as-a-dynamic-dispatched-operat) –

답변

3

당신이 얻는 이유 r.node의 내면의 컬렉션 동적 타입이며, 때문에 컴파일 오류입니다 따라서 확장 메소드를 찾을 수 없습니다.

귀하의 사례는 this question과 유사합니다. 대신 당신이해야 할 것은 :

nodes = ((IEnumerable<dynamic>)r.nodes) 
     .Select(c => new 
     { 
      c.Text, 
      c.Number, 
      nodes = c.Nodes 
     //and overhere keep looping through the nodes until it's done 
    }) 

당신이 두 번째 질문에 대해 r.nodes is IEnumerable<dynamic> ? /*the select*/ : Enumerable.Empty<dynamic>


을 할 수 캐스팅 할 때 나는 경우는 예외을받지 않습니다 있는지 확인하려면 당신이 무엇을 의미하는지 제대로 이해하면 dynamic을 얻은 다음 재귀 적으로 nodes 속성을 가지고 있는지 확인하고 nodes에 재귀 적으로 자신을 호출하는 경우 IEnumerable<dynamic> 속성을 검사합니다. 의 일반적인 생각을 따라 뭔가 :

public static IEnumerable<dynamic> SomeName (dynamic input) 
{ 
    var collection = input as IEnumerable<dynamic>; 
    if (collection == null) 
     return Enumerable.Empty<dynamic>(); 

    foreach (var item in collection) 
    { 
     /*recursive part*/ 
    } 

    return collection; 
} 

(시험하지 않았다 - 다만 빠른 개념 쓰기)

+0

고맙습니다, 완벽하게 작동합니다! 노드를 반복해서 순환하도록 어떻게 말할 수 있습니까? – shw

+0

@shw - 편집 : 편집을 참조하십시오. 코드 예제 –

+1

네, 그게 정확히 필요한 것입니다. 감사합니다 – shw

관련 문제