Posso adicionar atributos para uma propriedade do objeto em tempo de execução?
-
03-07-2019 - |
Pergunta
Por exemplo, eu quero remover ou alterar abaixo atributos de propriedade ou adicionar um novo. É possível?
[XmlElement("bill_info")]
[XmlIgnore]
public BillInfo BillInfo
{
get { return billInfo; }
set { billInfo = value; }
}
Solução
(edit - eu descaracterizou a pergunta original)
Você não pode adicionar atributos reais (eles são queimados para o IL); No entanto, com XmlSerializer
você não tem que - você pode fornecer atributos adicionais no construtor ao XmlSerializer
. Você, no entanto, necessidade de ser um pouco cuidadoso para armazenar em cache a instância XmlSerializer
se você fizer isso, caso contrário ele irá criar uma assembleia adicional por exemplo, que é um pouco gotejante. (Não faça isso se você usar o construtor simples que só leva um Type
). Olhada XmlAttributeOverrides
.
Por exemplo:
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; } }
}
Note-se também; se os atributos xml eram apenas ilustrativa, então há um segunda maneira de adicionar atributos para as coisas relacionadas aos dados de ligação, usando TypeDescriptor.CreateProperty
e quer ICustomTypeDescriptor
ou TypeDescriptionProvider
. Muito mais complexo do que o caso xml, estou com medo - e não funciona para todo o código -. Apenas o código que usa o componente de modelo
Outras dicas
Não é possível adicionar atributos / Remover de uma classe em tempo de execução.
É possível, no entanto, atualizar a forma como as obras de serialização XML em tempo de execução sem a necessidade de atributos de edição. Veja o post de Marc.
Editar Atualização