如何获得动态类型的属性值?

时间:2011-05-25 09:07:39

标签: c# asp.net-mvc-2 dynamic anonymous-types iqueryable

[更新]

  

对不起,我应该标记这个问题   作为MVC-2,我将查询结果传递给   view的模型,所以我必须指定类型   我的模型在View的标题中   确定指标。我声明这样:

     

Inherits="System.Web.Mvc.ViewPage<IQueryable<dynamic>>"

     

怎么都没有改变,也没有改变   答案对我不起作用:(。   最后我用了一个ModelView类   帮助我将查询结果放入其中。   :(

[/更新]

我有这样的查询:

IQueryable<dynamic> result = from d in KiaNetRepository.KiaNetEntities.Discounts
             where d.AgentTypeID == agentTypeId
             select new { d.Category,  d.DiscountValue, d.PriceConfige };

然后我在我看来像这样追溯价值:

foreach(var item in result){

    Category cat = item.Category; // throws exception 'object' does not contain a definition for 'Category' 

    //...

}

请注意,IQueryable的查询类型是匿名类...

4 个答案:

答案 0 :(得分:0)

尝试明确声明名称:

select new { Category = d.Category,  DiscountValue = d.DiscountValue, PriceConfige = d.PriceConfige }

答案 1 :(得分:0)

如果您因任何特定原因未强制结果为IQueryeable<dynamic>,我建议您使用var result = ...。这将使编译器使用result IQueryable<T>类型T,并使用new { ... }在select中创建的匿名类的类型。没有必要使用您在此处显示的代码中的dynamic

答案 2 :(得分:0)

如果您用IQueryable<dynamic>替换不合适的声明var,请确保它有效,我刚刚对其进行了测试。

答案 3 :(得分:0)

您的问题是视图页面中的foreach循环被编译为单独的程序集。由于匿名类型是内部的,因此动态不会看到它,因为权限不允许它。

最简单的解决方法是在查询语句中调用ToList(),然后选择每个匿名类型并将参数复制到声明的类或expandoobject。