2009-10-29 3 views
1

결과의 익명 객체를 반환하는 함수의 결과를 반복하려고합니다..net 3.5 anonymous foreach

public static object getLogoNav() 
{ 
    XDocument loaded = XDocument.Load(HttpContext.Current.Request.MapPath("~/App_Data/LOGO_NAV_LINKS.xml")); 

    var query = from x in loaded.Elements().Elements() 
       select new 
       { 
       Name = x.FirstAttribute.Value, 
       Value = x.Value 
       }; 

    return query; 
} 

코드 숨김 페이지 :

var results = Common.getLogoNav(); 
    foreach(var nav in results) { 
    string test = nav.Name; 
    } 
+3

무엇이 질문입니까? –

+0

이 작동하지 않습니다. – phxis

답변

5

당신은 (그 문제에 대한 4) C# 3의 반환 유형으로 익명 클래스를 가질 수 없습니다 당신은 익명에 개체를 캐스팅 할 수 없습니다 유형. 귀하의 세 가지 옵션은 다음과 같습니다

  • 이의를 캐스팅 익명 클래스의 범위 내에서 루프 (대부분의 시간,이 방법입니다)
  • 을 수행하고 (느린하지 않는 아주 쉽게 할 수 반사를 사용하여 당신은 표현 트리 마법을 사용한다.)
  • 명명 된 클래스로 변환하고 그것을 반환하고 인스턴스화한다.
  • (C# 4에서) 동적 인 마술을 만들면 비슷한 효과를 얻을 수 있지만 구문 적 설탕이있는 옵션 2와 실제로 동일합니다.
+0

나는 그것에 동의하기가 힘듭니다. 일부 컨트롤에 대한 데이터 소스로 사용되는 비슷한 기능을 가지고 있고 해당 컨트롤이 결과를 통해 적절하게 반복 할 수 있기 때문입니다. 이것은이 루프를 작동시키는 데 필요한 캐스팅의 일부가되어야한다는 것입니다. 아니? – phxis

+0

"익명 형식의 이름은 컴파일러에서 자동으로 생성되므로 프로그램 텍스트에서 참조 할 수 없습니다." - 이름을 지을 수 없기 때문에 반환 할 수 없으므로 캐스트 할 수 없습니다. 물론 Jon Skeet의 제네릭 형식 매개 변수 해킹을 제외하고는 실제로 사용하면 안됩니다. 그것은 순수한 악마입니다. –

+0

phxis : C# 메서드에서 익명 형식의 개체를 반환 할 수 있습니다. 그러나 이러한 컨트롤은 본질적으로 런타임시 해당 객체를 반영합니다. 익명 유형에 대한 컴파일 타임 액세스가 필요하지 않습니다. 귀하의 코드에서 멤버들에 대한 컴파일 타임 액세스를 얻으려고 시도하는 반면, Yuriy가 가리키는 끔찍한 해킹 없이는 그렇게 할 수 없습니다. – itowlson

2

Jon Skeet은 익명 유형을 반환하는 것에 대해 entry을 작성했습니다. 당신이 그것을 사용하지 않기를 바랍니다.