Могу ли я добавить атрибуты к свойству объекта во время выполнения?
-
03-07-2019 - |
Вопрос
Например, я хочу удалить или изменить приведенные ниже атрибуты свойства или добавить новый.Возможно ли это?
[XmlElement("bill_info")]
[XmlIgnore]
public BillInfo BillInfo
{
get { return billInfo; }
set { billInfo = value; }
}
Решение
(редактировать - я неправильно истолковал первоначальный вопрос)
Вы не можете добавить фактические атрибуты (они записываются в IL).;однако, с XmlSerializer
вам не обязательно - вы можете предоставить дополнительные атрибуты в конструкторе для XmlSerializer
.Однако вам нужно быть немного осторожнее, чтобы кэшировать XmlSerializer
экземпляр, если вы сделаете это, так как в противном случае это создаст дополнительную сборку для каждого экземпляра, которая немного протекает.(он не делает этого, если вы используете простой конструктор, который просто принимает Type
).Посмотрите на XmlAttributeOverrides
.
Для примера:
using System;
using System.Xml.Serialization;
public class Person
{
static void Main()
{
XmlAttributeOverrides overrides = new XmlAttributeOverrides();
XmlAttributes attribs = new XmlAttributes();
attribs.XmlIgnore = false;
attribs.XmlElements.Add(new XmlElementAttribute("personName"));
overrides.Add(typeof(Person), "Name", attribs);
XmlSerializer ser = new XmlSerializer(typeof(Person), overrides);
Person person = new Person();
person.Name = "Marc";
ser.Serialize(Console.Out, person);
}
private string name;
[XmlElement("name")]
[XmlIgnore]
public string Name { get { return name; } set { name = value; } }
}
Обратите также внимание;если бы xml-атрибуты были просто иллюстративными, то существует второй способ добавления атрибутов для вещей, связанных с привязкой к данным, с помощью TypeDescriptor.CreateProperty
и либо ICustomTypeDescriptor
или TypeDescriptionProvider
.Боюсь, что это намного сложнее, чем случай xml, и работает не для всего кода - только для кода, который использует компонентную модель.
Другие советы
Невозможно добавлять / удалять атрибуты из класса во время выполнения.
Однако можно обновить способ сериализации XML во время выполнения без необходимости редактировать атрибуты.Смотрите пост Марка.
Редактировать Обновленный