Подтвердить что ты не робот

Динамически добавлять свойства к существующему объекту

Я создаю объект person следующим образом.

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

Он имеет такие свойства.

person.Dob
person.Address

Но теперь я хочу добавить такие свойства, как это, и установить значения во время выполнения после создания объекта. person.age person.Sex

Как добавить эти дополнительные свойства после создания объекта. Это имя свойства может меняться время от времени. Из-за этого невозможно жестко закодировать "возраст" и "секс".

4b9b3361

Ответ 1

Это невозможно с "нормальным" объектом, но вы можете сделать это с помощью ключевого слова ExpandoObject и dynamic:

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

Если вы попытаетесь присвоить свойство, которое не существует, оно добавляется к объекту. Если вы попытаетесь прочитать свойство, которое не существует, оно вызовет исключение. Таким образом, это примерно такое же поведение, как и словарь (и ExpandoObject фактически реализует IDictionary<string, object>)

Ответ 2

Если вы не можете использовать динамический тип с ExpandoObject, вы можете использовать Механизм "Property Bag", где, используя словарь (или какой-либо другой тип набора ключей/значений), вы храните строку key, которая называет свойства и value требуемого типа.

См. здесь для примера реализации.

Ответ 3

Взгляните на ExpandoObject.

Например:

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

Дополнительное чтение здесь.

Ответ 4

Рассмотрим использование рисунка декоратора http://en.wikipedia.org/wiki/Decorator_pattern

Вы можете изменить декоратор во время выполнения с тем, который имеет разные свойства при возникновении события.

Ответ 5

Взгляните на библиотеку Clay:

http://clay.codeplex.com/

Он предоставляет нечто похожее на ExpandoObject, но с кучей дополнительных функций. Вот сообщение в блоге, объясняющее, как его использовать:

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

(обязательно прочтите пример интерфейса IPerson)