object o = new { foo = 1 };
有没有其他方法可以向对象添加属性?
o["foo"] = 1
和o.foo = 1
似乎都没有效果。
如果我输入
var o = new { foo = 1 };
为什么var
的类型是“AnonomuysType”而不是object
?
答案 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"