Posso aggiungere attributi a una proprietà dell'oggetto in fase di esecuzione?
-
03-07-2019 - |
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; }
}
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