Question

Par exemple, je souhaite supprimer ou modifier les attributs de propriété ou en ajouter un nouveau. Est-ce possible?

[XmlElement("bill_info")]
[XmlIgnore]
public BillInfo BillInfo
{
  get { return billInfo; }
  set { billInfo = value; }
}
Était-ce utile?

La solution

(modifier - j'ai mal interprété la question initiale)

Vous ne pouvez pas ajouter d'attributs réels (ils sont gravés dans le IL); Cependant, avec XmlSerializer , vous n'avez pas à le faire - vous pouvez fournir des attributs supplémentaires dans le constructeur à XmlSerializer . Cependant, vous devez faire un peu attention à la mise en cache de l'instance XmlSerializer , sinon vous créez un assembly supplémentaire par instance, ce qui est un peu fuite. (Cela ne fonctionne pas si vous utilisez le constructeur simple qui prend simplement un Type ). Consultez XmlAttributeOverrides .

Pour un exemple:

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; } }
}

Notez aussi; si les attributs xml étaient simplement illustratifs, il existe un seconde moyen d'ajouter des attributs pour des éléments liés à la liaison de données, en utilisant TypeDescriptor.CreateProperty et ICustomTypeDescriptor ou TypeDescriptionProvider . Bien plus complexe que le cas xml, j’ai peur - et ne fonctionne pas pour tout le code - du code qui utilise le modèle de composant.

Autres conseils

Il n'est pas possible d'ajouter / de supprimer des attributs d'une classe au moment de l'exécution.

Il est toutefois possible de mettre à jour le fonctionnement de la sérialisation XML au moment de l'exécution sans avoir à modifier les attributs. Voir le post de Marc.

MODIFIER mis à jour

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top