object o = new { foo = 1 };
オブジェクトにプロパティを追加する他の方法はありますか?
どちらo["foo"] = 1
もo.foo = 1
機能していないようです。
そして、私がタイプすると
var o = new { foo = 1 };
タイプがvar
「AnonomuysType」であり、そうでないのはなぜobject
ですか?
コンパイルされた型にプロパティを追加することはできません。プロパティとして機能するのは、 dynamic
APIを使用していて、オブジェクトが動的プロパティをサポートするものである場合のみです。次に例を示します。
dynamic obj = new ExpandoObject();
obj.Foo = 123;
obj.Bar = "abc";
ただし、これらの値はリフレクションでは使用できません。より簡単なアプローチは、辞書として動作するものかもしれません:
var obj = new Dictionary<string,object>();
obj["Foo"] = 123;
obj["Bar"] = "abc";
辞書 API を介して、さらに発見できるものがあります。あなたの最後の質問について:あなたがするとき:
var o = new { foo = 1 };
これnew { foo = 1 }
により、コンパイラは匿名型を生成します。これは、読み取り専用プロパティと発音できない名前を持つ通常の C# クラスです。これは(結局のところobject
通常の) として参照できますが、コンパイラを使用すると、プロパティ (この場合) にアクセスできる既知の型 (恐ろしい名前) が使用されます。class
var
.foo
すべてのオブジェクトObject
は匿名型からも継承します (この質問を参照してください)。ここでそれを見ることができます:
object o = new { foo = 1 };
if (o is object)
Console.Write("Yes, i'm an object!");
else
Console.Write("no, no, i'm not an object!");
匿名型にプロパティを追加することはできません。作成する場合のみです。
Dictionary<string, object>
代わりにa を使用できます。
var o = new Dictionary<string, object>();
o.Add("Foo", 123);
o.Add("Bar", "abc");
これで、次の方法でそれらにアクセスできます。
object bar = o["Bar"]; // "abc"