【问题标题】:How get propery value of an dynamic type?如何获取动态类型的属性值?
【发布时间】:2011-09-01 14:16:43
【问题描述】:

[更新]

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

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

什么都没有改变,也没有 答案对我不起作用:(。 最后我使用了一个 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 的查询类型是匿名类...

【问题讨论】:

  • 尝试探索itemindebuger,我想你会在那里找到答案
  • 调试器显示item 包含{ d.Category, d.DiscountValue, d.PriceConfige } 成员!!!我很困惑!
  • 你需要IQueryable&lt;dynamic&gt;吗?你不能只用IQueryable这个词吗?将其设置为 dynamic 将删除您的 IntelliSense,因为动态类型是为后期绑定而设计的。这也将帮助您解决为什么 Category 对象无效的问题。

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    如果您将不恰当的声明 IQueryable&lt;dynamic&gt; 替换为 var,请确保它有效,我也刚刚测试过。

    【讨论】:

    • @Jalal 为什么要对每个人投反对票?丹尼尔和我测试并发现它有效。问题不一定在于我们的答案是否准确,而可能是您的误解或应用不当?或者如果我们肯定是错的(这当然是可能的),请解释原因,根据我们的答案更新您的代码,显示它在哪里不起作用以及消息是什么。我们再次测试并让它工作。很奇怪,不是吗?
    • 最后我找到了另一个解决方案,我创建了一个 ModelView 类并通过它传递数据来查看,感谢大家的帮助。
    【解决方案3】:

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

    【讨论】:

    • 如果你删除了dynamic,它在运行时仍然抛出这个异常,你还没有重新编译。如果对象不是动态的,则会在编译时给出此类错误。
    • 也许我误解了你的答案,但你不能在课堂外公开vars,这样就行不通了。 dynamic 应该在这里工作,但由于某种原因它不能。
    【解决方案4】:

    尝试显式声明名称:

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

    【讨论】:

    • +1 是的 - 我认为 OP 的代码正在声明一个数组。
    • 它不会改变任何东西,它被编译成完全相同的 IL
    • 不,这完全一样。如果没有歧义,则属性名称不必是明确的。 new 没有类型名总是创建一个匿名类,而不是一个数组。
    猜你喜欢
    • 2017-01-15
    • 2013-01-04
    • 1970-01-01
    • 2017-05-27
    • 1970-01-01
    • 2016-10-07
    • 2010-12-13
    • 2020-02-13
    • 1970-01-01
    相关资源
    最近更新 更多