2012-10-24 129 views
1
object o = new { foo = 1 }; 

是否有任何其他方式來添加屬性的對象?將屬性添加到對象類型的對象

o["foo"] = 1也沒有o.foo = 1似乎工作。

如果我鍵入

var o = new { foo = 1 }; 

爲什麼是var的 「AnonomuysType」,而不是object類型?

回答

2

你不能只爲編譯的類型添加屬性。唯一的一次,將工作作爲屬性(當然,那種-的)是,如果你使用的是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)。

+0

我明白了。 'JavaScriptSerializer'會在序列化'dynamic'類型的對象時出現問題嗎? – Johan

+0

@約翰是的,它會;字典會更好, –

+0

好的,謝謝你的一個非常好的解釋。 – Johan

1

全部物體即使是匿名類型(請參閱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"