1
object o = new { foo = 1 };

オブジェクトにプロパティを追加する他の方法はありますか?

どちらo["foo"] = 1o.foo = 1機能していないようです。

そして、私がタイプすると

var o = new { foo = 1 };

タイプがvar「AnonomuysType」であり、そうでないのはなぜobjectですか?

4

2 に答える 2

2

コンパイルされた型にプロパティを追加することはできません。プロパティとして機能するのは、 dynamicAPIを使用していて、オブジェクトが動的プロパティをサポートするものである場合のみです。次に例を示します。

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通常の) として参照できますが、コンパイラを使用すると、プロパティ (この場合) にアクセスできる既知の型 (恐ろしい名前) が使用されます。classvar.foo

于 2012-10-24T12:16:07.103 に答える
1

すべてのオブジェクト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"
于 2012-10-24T12:16:41.030 に答える