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
所有对象甚至都继承自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!");
您不能将属性添加到匿名类型,只有在您创建它时。
您可以使用 aDictionary<string, object>
代替:
var o = new Dictionary<string, object>();
o.Add("Foo", 123);
o.Add("Bar", "abc");
现在您可以通过以下方式访问它们:
object bar = o["Bar"]; // "abc"