10

私はC#でDynamicObjectを使用しようとしていますが、動的な配列が必要でした。

var d = new dynamic[];

これは正常に動作します。

編集:以下のExpandoObjectを参照してください。

しかし、私はまた、この圧縮された初期化の新しい構文を使用して、その配列にいくつかのデータを入力するのが好きです。

var d = new dynamic[] { 
  new {
   Name = "Some",
   Number = 1010
  },
  new {
   Name = "Other",
   Number = 2010
  }
 }

しかし、その場合、すべてのオブジェクトは非動的タイプの「オブジェクト」を取得し、アイテムをループすると例外が発生します。

foreach (dynamic item in d)
{
  @item.Name
  @item.Number
}

エラー:「オブジェクト」に「名前」の定義が含まれていません。配列項目を間違った方法で初期化しただけだと思います。代わりに動的オブジェクトを追加するにはどうすればよいですか?

編集:新しいコンテンツ:

「動的」には、プロパティを動的に追加する機能がないことに気付きました。

内部ディクショナリ内のすべてのアイテムをプロパティとして公開するExpandoObjectを使用することをお勧めします。しかし残念ながら、ExpandoObjectはこの優れた圧縮作成構文をサポートしていないようであり、コンパイラーは次のように文句を言います。

var d = new ExpandoObject[]{
new ExpandoObject(){
    Name="Nnn",
    Number=1080
    }
}

したがって、答えは次のようになります。それは不可能です。

4

3 に答える 3

10

うまくいけば、あなたは本当にダイナミクスを必要としません

class Program
{
    static void Main(string[] args)
    {
        var d = new[]
                    {
                        new
                            {
                                Name = "Some",
                                Number = 1010
                            },
                        new
                            {
                                Name = "Other",
                                Number = 2010
                            }
                    };
        foreach (var item in d)
        {
            string s = @item.Name;
            int n = @item.Number;
            Console.WriteLine("{0} {1}", s, n);
        }
    }
}
于 2011-01-26T14:45:01.000 に答える
7

私は少し遅れて来ますが、これが私がそれについて見つけたものです:

ExpandoObjectを初期化できない場合は、動的タイプで初期化するのはどうですか?

だから私は次の拡張メソッドを実行しました

    public static ExpandoObject CreateExpando(this object item)
    {

        var dictionary = new ExpandoObject() as IDictionary<string, object>;
        foreach (var propertyInfo in item.GetType().GetProperties())
        {
            dictionary.Add(propertyInfo.Name, propertyInfo.GetValue(item, null));
        }
        return (ExpandoObject)dictionary;
    }

私はそれが理想からは程遠いことを知っています、しかしそれは私が今のところ達成できる最高のものです、それはこのように働きます:

var myExpandoObject = new { Name="Alex", Age=30}.CreateExpando();
于 2011-09-14T08:52:39.890 に答える
1

オープンソースフレームワークImpromptu-Interfaceには、ExpandoObjectで機能する圧縮された初期化構文があります。

dynamic @new = Builder.New<ExpandoObject>();

var d = @new.List( 
  @new.Expando(
   Name:"Some",
   Number: 1010
  ),
  @new.Expando(
   Name:"Other",
   Number: 2010
  )
 );
于 2011-04-21T03:07:02.407 に答える