DOBON.NET DOBON.NETプログラミング掲示板過去ログ

匿名型の動的生成に関して

環境/言語:[環境 Windows 7/使用言語 C# .net4.0]
分類:[.NET]

お世話になっております。

匿名型のクラスを動的に生成することが出来ないか模索しております。

具体的には以下のようなことです。

var tmp = new { name = "hogehoge", age = 100};

上記のコードを
変数名と値をDictionaryか何かに保持しておき
そのDictionaryをもとに匿名型を生成したいのです。

うまく伝わっているでしょうか?例えば下記のようなイメージです。

     Dictionary<string, object> dic = new Dictionary<string, object>();
     dic.Add("name", "hogehoge");
     dic.Add("age", 10);

     foreach(var key in dic.Keys)
     {
         // ここで key を変数名、dic[key]を値にして
         // どうにかして匿名型を生成する
         // あくまでイメージですので別にループ内でなくてもいいです。
     }

かなり無茶な質問かと思いますが
何卒よろしくお願い致します。
■No31793に返信(Yesmanさんの記事)
> 匿名型のクラスを動的に生成することが出来ないか模索しております。
> var tmp = new { name = "hogehoge", age = 100};

いわゆる expando object ですかね?
C#4.0 であれば、System.Dynamic.ExpandoObject が使えます。


dynamic tmp1 = new ExpandoObject();
tmp1.name = "hogehoge";
tmp1.age = 100;

dynamic tmp2 = new ExpandoObject();
var dic = new Dictionary<string, object>() { { "name", "hogehoge" }, { "age", 10 } };

IDictionary<string, object> wk = tmp2;
foreach (var item in dic) { wk.Add(item.Key, item.Value); }

Console.WriteLine("----- tmp1 -----");
Console.WriteLine(tmp1.name);
Console.WriteLine(tmp1.age);

Console.WriteLine("----- tmp2 -----");
Console.WriteLine(tmp2.name);
Console.WriteLine(tmp2.age);


列挙したいなら
「foreach (var item in (IDictionary<string, object>)tmp1)」
とでもしてやれば OK。
魔界の仮面弁士様

まさしくご教示くださった内容のことが目的でした!
ありがとうございました!

■No31794に返信(魔界の仮面弁士さんの記事)
> ■No31793に返信(Yesmanさんの記事)
>>匿名型のクラスを動的に生成することが出来ないか模索しております。
>>var tmp = new { name = "hogehoge", age = 100};
>
> いわゆる expando object ですかね?
> C#4.0 であれば、System.Dynamic.ExpandoObject が使えます。
>
>
> dynamic tmp1 = new ExpandoObject();
> tmp1.name = "hogehoge";
> tmp1.age = 100;
>
> dynamic tmp2 = new ExpandoObject();
> var dic = new Dictionary<string, object>() { { "name", "hogehoge" }, { "age", 10 } };
>
> IDictionary<string, object> wk = tmp2;
> foreach (var item in dic) { wk.Add(item.Key, item.Value); }
>
> Console.WriteLine("----- tmp1 -----");
> Console.WriteLine(tmp1.name);
> Console.WriteLine(tmp1.age);
>
> Console.WriteLine("----- tmp2 -----");
> Console.WriteLine(tmp2.name);
> Console.WriteLine(tmp2.age);
>
>
> 列挙したいなら
> 「foreach (var item in (IDictionary<string, object>)tmp1)」
> とでもしてやれば OK。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板