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

Могу ли я добавлять атрибуты к свойству объекта во время выполнения?

Например, я хочу удалить или изменить атрибуты свойств или добавить новый. Возможно ли это?

[XmlElement("bill_info")]
[XmlIgnore]
public BillInfo BillInfo
{
  get { return billInfo; }
  set { billInfo = value; }
}
4b9b3361

Ответ 1

(изменить - я неправильно читаю исходный вопрос)

Вы не можете добавить фактические атрибуты (они сжигаются в 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, я боюсь - и не работает для всего кода - просто код, который использует компонентную модель.

Ответ 2

Невозможно добавить/удалить атрибуты из класса во время выполнения.

Однако возможно обновить способ работы сериализации XML во время выполнения без необходимости редактировать атрибуты. См. Сообщение Марка.

EDIT Обновлено