我能在运行时向对象属性添加属性吗?

11
例如,我想删除或更改下面的属性特性,或者添加一个新的。这是否可能?
[XmlElement("bill_info")]
[XmlIgnore]
public BillInfo BillInfo
{
  get { return billInfo; }
  set { billInfo = value; }
}

5
为什么这个标记既有 XmlIgnore 又有 XmlElement? - Marc Gravell
2个回答

14

(编辑 - 我误读了原问题)

您无法添加实际属性(它们被编译入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.CreatePropertyICustomTypeDescriptorTypeDescriptionProvider。恐怕比xml情况更复杂-并且不适用于所有代码-只适用于使用组件模型的代码。


Marc,你从哪里得到的信息说它会为每个实例创建一个额外的程序集?它确实这样做了,但我在文档中没有找到相关说明。 - Rafael Mueller

3

在运行时不能添加或删除类的属性。

但是,在不需要编辑属性的情况下,可以更新运行时的XML序列化方式。请参阅Marc的帖子。

编辑 已更新


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接