Динамически добавлять свойства к существующему объекту
Я создаю объект person следующим образом.
Person person=new Person("Sam","Lewis")
Он имеет такие свойства.
person.Dob
person.Address
Но теперь я хочу добавить такие свойства, как это, и установить значения во время выполнения после создания объекта.
person.age
person.Sex
Как добавить эти дополнительные свойства после создания объекта. Это имя свойства может меняться время от времени. Из-за этого невозможно жестко закодировать "возраст" и "секс".
Ответы
Ответ 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)