2011-03-02 60 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