如何获取动态类型的属性值?
[更新]
抱歉,我应该标记这个问题 作为 MVC-2,我将查询结果传递到 视图的模型,所以我必须指定类型 我的模型在视图标题中 定义。我这样声明:
Inherits="System.Web.Mvc.ViewPage
>" 怎么一切都没有改变,也没有 答案对我不起作用:(。 最后我使用了 ModelView 类作为 helper 将我的查询结果放入其中。 :(
[/update]
我有一个这样的查询:
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 的查询类型是匿名类...
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
尝试显式声明名称:
Try to declare names explicitly:
如果您出于任何特定原因不强制结果为
IQueryeable
,我建议使用var result = ...
。这将使编译器生成IQueryable
类型的result
,其中T
是您使用new 创建的匿名类的类型{ ... }
在选择中。没有必要在此处显示的代码中使用dynamic
。If you are not forcing result to be of
IQueryeable<dynamic>
for any specific reason, I would recommend usingvar result = ...
. This will let the compiler makeresult
of typeIQueryable<T>
withT
the type of the anonymous class that you create usingnew { ... }
in the select. There is no necessity for usingdynamic
from the code that you show here.如果您将不适当的声明
IQueryable
替换为var
,那么它肯定有效,我刚刚也测试过它。If you replace the inappropriate declaration
IQueryable<dynamic>
byvar
, sure it works, I've just also tested it.您的问题是视图页面中的 foreach 循环被编译成单独的程序集。由于匿名类型是内部的,因此动态看不到它,因为权限不允许它。
最简单的修复方法是在查询语句上调用
ToList()
,然后选择每个匿名类型并将参数复制到声明的类或扩展对象。Your problem is that your
foreach
loop being in the view page gets compiled into a separate assembly. Since anonymous types are internal the dynamic doesn't see it because of the permissions don't allow it.Simplest fix is to call
ToList()
on your query statement and then select each anonymous type and copy parameters to a declared class or expandoobject.