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