object o = new { foo = 1 };
是否有任何其他方式來添加屬性的對象?將屬性添加到對象類型的對象
o["foo"] = 1
也沒有o.foo = 1
似乎工作。
如果我鍵入
var o = new { foo = 1 };
爲什麼是var
的 「AnonomuysType」,而不是object
類型?
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
)。
全部物體即使是匿名類型(請參閱this question)也繼承自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>
代替:
var o = new Dictionary<string, object>();
o.Add("Foo", 123);
o.Add("Bar", "abc");
現在你可以通過這種方式訪問它們:
object bar = o["Bar"]; // "abc"
我明白了。 'JavaScriptSerializer'會在序列化'dynamic'類型的對象時出現問題嗎? – Johan
@約翰是的,它會;字典會更好, –
好的,謝謝你的一個非常好的解釋。 – Johan