2011-01-26 18 views
7

イムは、C#でDynamicObjectを使用しようとしている、と私はダイナミックの配列を必要と:ダイナミックな配列| ExpandoObject |で圧縮された初期化構文

正常に動作します
var d = new dynamic[]; 

EDIT:下記のExpandoObjectを参照してください。

しかし、私はまた、この圧縮されたが、新しい構文を初期化すると、いくつかのデータとその配列を埋めるのが好き:

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

しかし、その場合には、すべてのオブジェクトは、項目を非ダイナミック型の「オブジェクト」とループを取得

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

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

EDIT:新しいコンテンツ:

私は「ダイナミック」の実現には、動的にプロパティを追加する機能を持っていません。

私は、内部ディクショナリ内のすべてのアイテムをプロパティとして公開するExpandoObjectを使用する方がよいでしょう。しかし残念ながらExpandoObjectは、この素敵な圧縮された構文を作成サポートしていないようだ、とコンパイラが文句:

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

だから、答えはちょうどかもしれません:それは不可能です。

+4

あなたはよろしいです匿名型の配列を必要としないだけですか? – Ani

+1

これはASP.NET MVC3でですか? –

+1

'dynamic'は' object'ですが、C#コンパイラはこれを別々に扱い、 'dynamic'のすべてのアクセスをDLRに渡します。 – thecoop

答えて

4

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

私が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(); 
+0

ありがとうアレックス、良いアイデア。 – joeriks

+0

投影法が関数に格納されている場合、この拡張メソッドを使用できますか? 'someQueryable.Select(ReusableProjection()。ToExpando())'、 'ReusableProjection'はこれを返します:' Expression > ' – sports

6

うまくいけば、あなたは本当にダイナミクス

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); 
     } 
    } 
} 
+0

はい、私は思ったので、私もそれを試みましたが、それは私に同じエラーを与えます。うーん... – joeriks

+0

@joeriks - 私が立ち上げていたコード全体を追加しました。私はエラーがありません。 – Snowbear

+0

@joeriks - それがASP.Net MVCに関連している場合は、おそらくそれに応じて質問にタグ付けする必要があります。私の答えがどのようにかみそりの行動と相関しているか分かりません。 – Snowbear

1

ExpandoObjectで動作compressed initialization syntaxを持ってImpromptu-Interfaceオープンソースのフレームワークを必要としません。

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

var d = @new.List( 
    @new.Expando(
    Name:"Some", 
    Number: 1010 
), 
    @new.Expando(
    Name:"Other", 
    Number: 2010 
) 
); 
+0

クール、私は即興を見せます。 – joeriks

関連する問題