2011-03-02 6 views
3

'동적'유형의 코드 숨김에서 공용 속성을 만들고 (익명 객체를 반환하는) aspx 페이지에 노출하면 변수가 ' 목적'. 이 올바른지? 언제 내가 말하는 예외가이 작업을 수행하려고임베디드 코드에서 동적 유형의 AC# 변수 사용

'객체'여기 val1과

에 대한 정의를 포함하지 않는이 예입니다 :

public dynamic showMe 
    { 
     get 
     { 
      return new 
      { 
       val1 = 5, 
       val2 = "This is val2", 
       val3 = new List<int>(){1,2,3,4,5} 
      }; 
     } 
    } 

영문 페이지 I에 가지고있다 :

<h2><%= showMe.val1 %></h2> 

이 이미지를 통해 나는 실제로 aspx 페이지에서 동적 객체 내부의 속성에 대해 알고 있어야합니다.

Debugger on aspx page showing the contents of showMe

는 사람이 포함 된 코드를 통해 익명 객체의 속성을 참조하는 방법을 알고 있습니까, 아니면 타입 시스템으로 간단하게 가능하지 않다? 감사.

답변

2

다이렉트 대답

는 사실이 문제가 Annonymous 유형의 공용 속성을하지 않아도, 그들은 내부 속성을 가지고있다. Aspx는 별도의 어셈블리로 컴파일되므로 동적 호출을 시도 할 때 속성이 표시되지 않습니다. 내장으로 표시되어 호출하는 곳에서 액세스 할 수 없기 때문입니다. 가장 간단한 가장 간단한 해결책은 Anonymous 객체 대신 ExpandoObject를 사용하는 것입니다. 이런 경우

당신이 정말로 익명 객체를 사용하려면 또 다른 솔루션

public dynamic showMe 
    { 
     get 
     { 
      dynamic exp = new ExpandoObject(); 
       exp.val1 = 5, 
       exp.val2 = "This is val2", 
       exp.val3 = new List<int>(){1,2,3,4,5} 
      return exp; 
     } 
    } 

당신이 인터페이스를 선언해야합니까하지만 당신은 더미 클래스를 생성하지 않고 정적 타이핑을 얻을 ImpromptuInterface을 사용하는 것입니다. 그것은 원래 어셈블리의 컨텍스트에서 dlr을 사용하여 호출을 전달하는 경량 프록시를 작성합니다. 이는 리플렉션보다 훨씬 빠릅니다.

interface IMyInterface{ 
    int val1 {get;} 
    string val2 {get;} 
    IList<int>val3 {get;} 
} 

public IMyInterface showMe 
    { 
     get 
     { 
      return new 
      { 
       val1 = 5, 
       val2 = "This is val2", 
       val3 = new List<int>(){1,2,3,4,5} 
      }.ActLike<IMyInterface>(); 
     } 
    } 
+0

ExpandoObject가 트릭을 수행합니다. 감사합니다. – kd7iwp

+0

+1 즉석 인터페이스 용 –