2011-03-02 57 views
3

似乎在類型爲「dynamic」的代碼隱藏中創建一個公共屬性(返回一個匿名對象)並將其暴露給您的aspx頁面將該變量轉換爲類型'目的'。它是否正確?每當我試圖做到這一點我得到一個異常說在嵌入代碼中使用動態類型的ac#變量

「對象」不包含VAL1

這裏的定義是一個例子:

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

在ASPX頁面我有:

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

並與此圖像,你可以看到,在我的aspx頁面,它確實瞭解動態對象內的屬性。

Debugger on aspx page showing the contents of showMe

有誰知道的方式通過嵌入代碼來引用匿名對象的屬性,或者是它根本不可能與類型的系統?謝謝。

回答

2

直接回答

其實這個問題是Annonymous類型沒有公共屬性,他們有內部屬性。一個Aspx被編譯成一個單獨的程序集,所以當你嘗試動態調用它時,並沒有看到該屬性在那裏,因爲它被標記爲內部,你不能訪問你正在調用的地方。最快最簡單的解決方案是使用ExpandoObject而不是Anonymous對象。

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 2011-03-02 18:29:31

+0

+1即興接口 – 2011-03-02 23:26:09