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

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

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

Ответы [ 2 ]

14 голосов
/ 02 марта 2009

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

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

3 голосов
/ 02 марта 2009

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

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

РЕДАКТИРОВАТЬ Обновлено

...