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

4

[更新]

很抱歉,我应该将这个问题标记为MVC-2,我将查询结果传递到视图的模型中,因此我必须在视图的头部定义中指定我的模型类型。我像这样声明:

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是匿名类。

尝试在调试器中探索“item”,我认为你会在那里找到答案。 - Anton Semenov
调试器显示item包含{ d.Category, d.DiscountValue, d.PriceConfige }成员!!! 我感到困惑! - Jalal
你需要使用 IQueryable<dynamic> 吗? 你不能只使用 IQueryable 这个单词吗?将其作为 dynamic 使用会移除 IntelliSense,因为动态类型是设计用于晚期绑定的。这也可以帮助你解决关于为什么“类别(Category)”对象无效的问题。 - Dominic Zukiewicz
4个回答

0
尝试显式声明变量名:
select new { Category = d.Category,  DiscountValue = d.DiscountValue, PriceConfige = d.PriceConfige }

没错,我认为楼主的代码在声明一个数组。+1 - Andras Zoltan
1
它不会改变任何东西,它被编译成完全相同的IL。 - Thomas Levesque
1
不,这完全相同。如果没有歧义,属性名称不必明确。new没有类型名称时,总是创建一个匿名类,而不是数组。 - paulmey

0
如果你没有强制要求结果为IQueryeable<dynamic>的特定原因,我建议使用var result = ...。这将让编译器将result的类型设置为IQueryable<T>,其中T是使用new { ... }在select语句中创建的匿名类的类型。从你展示的代码中看,并没有必要使用dynamic

如果您删除了 dynamic,但在运行时仍然抛出此异常,则说明您尚未重新编译。如果对象不是动态的,则会在编译时出现此类错误。 - paulmey
也许我误解了你的回答,但是你不能在类外部暴露 var,所以那样行不通。dynamic 在这里应该可以工作,但出于某种原因它没有起作用。 - Josh M.

0

如果你用var替换不合适的声明IQueryable<dynamic>,那么它肯定可以工作,我已经测试过了。


@Jalal 为什么要给每个人投反对票?Daniel和我进行了测试,发现它是有效的。问题不一定在于我们的答案是否准确,而可能是由于您的误解或错误应用导致的。或者如果我们绝对是错的(当然也有可能),请解释原因,按照我们的答案更新您的代码,展示它在哪里不起作用以及信息是什么。我们两个人都测试并成功了。相当奇怪,不是吗? - Ssithra
最终我找到了另一个解决方案,我创建了一个ModelView类,并通过它将数据传递给视图, 感谢大家的帮助。 - Jalal

0
你的问题在于你的foreach循环位于视图页面中,被编译为单独的程序集。由于匿名类型是内部的,动态类型无法看到它,因为权限不允许。最简单的解决方法是在查询语句上调用ToList(),然后选择每个匿名类型并将参数复制到已声明的类或expandoobject中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接