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

StackOverflow https://stackoverflow.com/questions/602384

  •  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 во время выполнения без необходимости редактировать атрибуты.Смотрите пост Марка.

Редактировать Обновленный

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top