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

C# 如何获取动态类型的属性值?,c#,asp.net-mvc-2,dynamic,anonymous-types,iqueryable,C#,Asp.net Mvc 2,Dynamic,Anonymous Types,Iqueryable,[更新] 对不起,我应该给这个问题加上标签 作为MVC-2,我将查询结果传递到 视图的模型,因此我必须指定类型 视图标题中我的模型的 定义。我宣布如下: IQueryable<dynamic> result = from d in KiaNetRepository.KiaNetEntities.Discounts where d.AgentTypeID == agentTypeId select new { d.Category,

[更新]

对不起,我应该给这个问题加上标签 作为MVC-2,我将查询结果传递到 视图的模型,因此我必须指定类型 视图标题中我的模型的 定义。我宣布如下:

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' 

    //...

}
Inherits=“System.Web.Mvc.ViewPage”

然而,一切都没有改变,一切都没有改变 答案不适合我:(。 最后,我使用ModelView类作为 助手将我的查询结果放入其中。 :(

[/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的查询类型是匿名类…

请尝试显式声明名称:

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

如果您没有出于任何特定原因强制结果为
IQueryable
,我建议使用
var result=…
。这将允许编译器使用
new{…}创建的匿名类的类型,生成
result
类型的
IQueryable
在选择中。没有必要使用此处显示的代码中的
dynamic

如果用
var
替换不适当的声明
IQueryable
,请确保它可以工作,我刚刚对它进行了测试。

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


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

尝试exprole
item
indebuger,我想你会发现调试器显示
item
包含
{d.类别,d.折扣值,d.价格配置}
members!!!我被搞糊涂了!你需要
IQueryable
吗?你不能直接用
IQueryable
这个词吗。把它作为
动态的
会删除你的IntelliSense,因为动态类型是为后期绑定设计的。这也会帮助你解决
类别
对象无效的问题。+1是的-I think OP的代码以其他方式声明数组。它不会更改任何内容,它编译为完全相同的ILno,这是完全相同的。如果没有歧义,则属性名称不必显式。
new
如果没有类型名称,则始终创建匿名类,而不是数组。如果删除
dynamic
,则它仍然是在运行时抛出此异常,您没有重新编译。如果对象不是动态的,则会在编译时给出此类错误。可能我误解了您的答案,但您不能将
var
s暴露在类外,因此这不起作用。
dynamic
应该在这里起作用,但出于某种原因它不起作用。@Jalal为什么对所有人都投反对票?Daniel和我进行了测试,发现它是有效的。问题不一定在于我们的答案是否准确,而可能在于您的误解或错误的应用?或者如果我们肯定是错的(这当然是可能的),请解释原因,根据我们的答案更新代码,显示哪里不起作用以及消息是什么。我们两人再次测试并让它起作用。很奇怪,不是吗?最后我找到了另一个解决方案,我创建了一个ModelView类,并通过该类传递数据进行查看,谢谢大家的帮助。