2012-10-24 87 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"