1
object o = new { foo = 1 };

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

两者似乎都不起作用o["foo"] = 1o.foo = 1

如果我输入

var o = new { foo = 1 };

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

4

2 回答 2

2

您不能只将属性添加到已编译类型。唯一可以用作属性(嗯,有点)的情况是,如果您使用的是dynamicAPI,并且对象是支持动态属性的东西,例如:

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它是常规的),但是当您使用编译器时,会使用已知类型(具有可怕的名称),这使您可以访问属性(在这种情况下)。classvar.foo

于 2012-10-24T12:16:07.103 回答
1

所有对象甚至都继承自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"
于 2012-10-24T12:16:41.030 回答