【问题标题】:How to fetch data from List<dynamic>()? [duplicate]如何从 List<dynamic>() 中获取数据? [复制]
【发布时间】:2014-05-15 14:16:23
【问题描述】:

我的代码是这样的

var eventDocs = new List<dynamic>();     
foreach (var node in eventtypeNode.GetDescendantNodes())
{
    string files = node.GetProperty("document").Value;
    eventDocs.Add(new { Id = node.Id, Name = node.Name, CreatedOn = node.CreateDate, Path = files });
}

这很好用。现在我正在尝试从这个动态列表中获取数据

foreach (var eventDoc in eventDocs)
{
     eventDoc.----  //nothing comes on intellisence
}

IntelliSense 什么都没有?我做错什么了吗?

【问题讨论】:

  • 你为什么还要使用dynamic?你在那里有一个明确定义的类型。创建一个类并使用它。
  • @SimonWhitehead 同意。完全滥用dynamic

标签: c# dynamic


【解决方案1】:

您不会从 Intellisense 获得任何东西,因为您有一个 List&lt;dynamic&gt;。你是说,“我在编译时不知道这个列表将包含什么。当我访问元素的成员时,只需在执行时动态绑定它。”

鉴于您将绑定推迟到执行时间,为什么 Intellisense 无法判断列表中的内容会令您感到惊讶?

在我看来,您应该更改代码以使用 LINQ 查询开始 - 然后您可以拥有一个具有已知元素类型的列表,这将是一个匿名类型。

var eventDocs = eventtypeNode.GetDescendantsNodes()
      .Select(node => new { Id = node.Id, 
                            Name = node.Name, 
                            CreatedOn = node.CreateDate,
                            Path = node.GetProperty("document").Value })
      .ToList();

【讨论】:

    【解决方案2】:

    不能像这样访问动态成员,试试GetDynamicMemberNames()GetMetaObject方法

    【讨论】:

      【解决方案3】:

      Intellisense 不会显示建议,因为数据是 dynamic,它不知道要显示什么。

      但你知道它包含什么。所以只要写代码就可以了。

      另外,这里不需要dynamic 对象。由于您想要的内容已明确定义,只需使用必要的属性和方法定义您的类,然后创建列表:

      List<YourClass> list = new List<YourClass>();
      

      然后 Intellisense 将变得足够智能以显示建议;)

      【讨论】:

      • ...那为什么要使用dynamic? OP 具有明确定义的类型。做到这一点..
      • @SimonWhitehead,它是什么类型的?你能告诉我以便我编辑吗?我没有遇到过 Node 等。OP 使用的类型的名称是什么?
      • 你不需要知道。 OP 将匿名对象存储到动态列表中。 OP 只需要定义一个实际对象(不是匿名对象)并输入列表 - 繁荣,智能感知。
      • @SimonWhitehead,我的编辑可以吗?
      猜你喜欢
      • 1970-01-01
      • 2021-03-14
      • 1970-01-01
      • 1970-01-01
      • 2021-09-25
      • 1970-01-01
      • 2022-06-19
      • 1970-01-01
      • 2019-10-01
      相关资源
      最近更新 更多