Domanda

Ad esempio, voglio rimuovere o modificare gli attributi di proprietà sottostanti o aggiungerne uno nuovo. È possibile?

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

Soluzione

(modifica - Ho letto male la domanda originale)

Non è possibile aggiungere attributi reali (vengono masterizzati in IL); tuttavia, con XmlSerializer non è necessario: puoi fornire ulteriori attributi nel costruttore a XmlSerializer . Tuttavia, devi fare un po 'di attenzione per memorizzare nella cache l'istanza XmlSerializer se lo fai, altrimenti creerà un assembly aggiuntivo per istanza, che è un po' fuoriuscito. (non lo fa se si utilizza il costruttore semplice che accetta solo un Type ). Guarda XmlAttributeOverrides .

Per un esempio:

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

Nota anche; se gli attributi xml fossero solo illustrativi, allora c'è un secondo per aggiungere attributi per cose legate all'associazione dei dati, usando TypeDescriptor.CreateProperty e ICustomTypeDescriptor o TypeDescriptionProvider . Molto più complesso del caso xml, temo - e non funziona per tutto il codice - solo il codice che utilizza il componente-modello.

Altri suggerimenti

Non è possibile aggiungere / rimuovere attributi da una classe in fase di runtime.

È possibile tuttavia aggiornare il modo in cui la serializzazione XML funziona in fase di esecuzione senza la necessità di modificare gli attributi. Vedi il post di Marc.

MODIFICA Aggiornato

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top