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で再テストします。

アップデートは以下をテストしました:

  • Mono 2.10 を使用して Windows で実行される Linux でコンパイルされた (dmcs) バイナリ: OK
  • MS.NET 4.0 を搭載した Windows で実行される Linux でコンパイルされた (dmcs) バイナリ: OK
  • Mono 2.10 を使用して Windows で実行される Windows でコンパイルされた (dmcs) バイナリ: OK
  • Windows でコンパイルされた (dmcs) バイナリは、MS.NET 4.0 を搭載した Windows で実行されます: OK
  • Windows でコンパイルされた (csc.exe) バイナリは、Mono 2.10 を使用して Windows で実行されます: OK
  • MS.NET 4.0 を搭載した Windows で実行される Windows でコンパイルされた (csc.exe) バイナリ: 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 に答える