动态添加属性到现有对象

我像这样创建person对象。

Person person=new Person("Sam","Lewis") 

它有这样的属性。

 person.Dob person.Address 

但现在我想添加这样的属性,并在创建对象后在运行时设置值。 人。年老的人

如何在创建对象后添加这些额外的属性。 那些属性名称可以不时更改。 因此,不能硬编码“年龄”和“性别”。

使用“普通”对象是不可能的,但您可以使用ExpandoObjectdynamic关键字来完成:

 dynamic person = new ExpandoObject(); person.FirstName = "Sam"; person.LastName = "Lewis"; person.Age = 42; person.Foo = "Bar"; ... 

如果尝试分配不存在的属性,则会将其添加到对象中。 如果您尝试读取不存在的属性,则会引发exception。 所以它与字典的行为大致相同(而ExpandoObject实际上实现了IDictionary

看一下ExpandoObject 。

例如:

 dynamic person = new ExpandoObject(); person.Name = "Mr bar"; person.Sex = "No Thanks"; person.Age = 123; 

另外阅读这里 。

如果你不能使用带有ExpandoObject的动态类型,那么你可以使用’Property Bag’机制,其中,使用字典(或其他一些键/值集合类型)存储字符串key ,命名属性和value s所需类型。

请参阅此处以获取示例实现 。

考虑使用装饰器模式http://en.wikipedia.org/wiki/Decorator_pattern

您可以在运行时使用在事件发生时具有不同属性的装饰器更改装饰器。

看看Clay库:

http://clay.codeplex.com/

它提供类似于ExpandoObject的东西,但有一些额外的function。 这是博客文章解释如何使用它:

http://weblogs.asp.net/bleroy/archive/2010/08/18/clay-malleable-c-dynamic-objects-part-2.aspx

(一定要阅读IPerson接口示例)