Например, я хочу удалить или изменить атрибуты свойств или добавить новый. Возможно ли это?
[XmlElement("bill_info")]
[XmlIgnore]
public BillInfo BillInfo
{
get { return billInfo; }
set { billInfo = value; }
}
Например, я хочу удалить или изменить атрибуты свойств или добавить новый. Возможно ли это?
[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 во время выполнения без необходимости редактировать атрибуты. См. Сообщение Марка.
EDIT Обновлено