5
dynamic model = new ExpandoObject();
model.Data = "asdf";

List<dynamic> listOfx = new List<dynamic>();
for (int i = 0; i < 3; i++) {
    dynamic x = new ExpandoObject();
    x.ID = i;
    x.Name = "test" + i.ToString();
    listOfx.Add(x);
}
model.listOfx = listOfx;

当我运行它时,我可以看到模型内的数据,但看不到 listOfx。

问题:如何在 ExpandoObject 中获取列表(或 IEnumerable)

解决方案更新: 在此处输入图像描述

因为我在本地窗口中看不到 lifOfx,所以我认为它不起作用。在这里(通过 y)你可以看到它。:-)

4

3 回答 3

4

我无法在 Mono 2.10 上重现类似问题:

using System.Dynamic;
using System.Collections.Generic;

using System;

public class Program
{
    public static void Main(string[] args)
    {
        dynamic x = new ExpandoObject();
        x.Data ="test";
        x.Arr = new [] { "test1","test2"};
        x.Lst = new List<string> { "aap", "noot", "mies" };

        Console.WriteLine(string.Join(", ", x.Arr));
        Console.WriteLine(string.Join(", ", x.Lst));
    }
}

输出:

/tmp @ dmcs test.cs && mono test.exe
test1, test2
aap, noot, mies

我很快就会在 Windows 上重新测试。

更新测试了以下内容:

  • linux 编译的 (dmcs) 二进制文件在带有 Mono 2.10 的 Windows 上运行:OK
  • linux 编译的 (dmcs) 二进制文件在带有 MS.NET 4.0 的 Windows 上运行:OK
  • Windows 编译的 (dmcs) 二进制文件在带有 Mono 2.10 的 Windows 上运行:OK
  • Windows 编译的 (dmcs) 二进制文件在带有 MS.NET 4.0 的 Windows 上运行:OK
  • Windows 编译的 (csc.exe) 二进制文件在带有 Mono 2.10 的 Windows 上运行:OK
  • Windows 编译的 (csc.exe) 二进制文件在带有 MS.NET 4.0 的 Windows 上运行:OK

在linux上我只测试了mono本身编译的二进制文件,但我预计不会有任何问题。也许在 List<> 中存储动态有一些微妙的不同,我现在来测试一下

于 2011-10-19T22:42:14.503 回答
4

上面的代码非常适合设置列表。例如,在您的代码之后添加它可以正常工作:

// Access value inside list
Console.WriteLine(model.listOfx[1].Name);

// Iterate through list
foreach (var o in model.listOfx)
{
    Console.WriteLine(o.ID);
}

例如,尝试以下(功能齐全的示例):

using System;
using System.Collections.Generic;
using System.Dynamic;
using System.Linq;

public static class Test
{

    public static void Main()
    {
        dynamic model = new ExpandoObject();
        model.Data = "asdf";

        List<dynamic> listOfx = new List<dynamic>();
        for (int i = 0; i < 3; i++)
        {
            dynamic x = new ExpandoObject();
            x.ID = i;
            x.Name = "test" + i.ToString();
            listOfx.Add(x);
        }
        model.listOfx = listOfx;

        // Access value inside list
        Console.WriteLine(model.listOfx[1].Name);

        // Iterate through list
        foreach (var o in model.listOfx)
        {
            Console.WriteLine(o.ID);
        }

        Console.ReadKey();
    }
}

这使用您的确切示例代码。

于 2011-10-19T22:42:44.087 回答
0

ExpandoObject 支持 IDictionary。您可以将其转换为

IDictionary myModel =(IDictionary)Model;

所以你可以迭代它。

于 2011-10-19T22:41:07.347 回答