将属性添加到object类型的对象

时间:2012-10-24 12:13:09

标签: c# asp.net

object o = new { foo = 1 };

有没有其他方法可以向对象添加属性?

o["foo"] = 1o.foo = 1似乎都没有效果。

如果我输入

var o = new { foo = 1 };

为什么var的类型是“AnonomuysType”而不是object

2 个答案:

答案 0 :(得分: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)。

答案 1 :(得分:1)

所有对象都从Object继承,甚至是匿名类型(请参阅this question)。你可以在这里看到:

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"