【问题标题】:Can I add attributes to an object property at runtime?我可以在运行时向对象属性添加属性吗?
【发布时间】:2009-03-02 13:39:43
【问题描述】:

例如,我想删除或更改以下属性属性或添加新属性。有可能吗?

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

【问题讨论】:

  • 出于兴趣,为什么同时标记了 XmlIgnore 和 XmlElement?

标签: c# serialization attributes


【解决方案1】:

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

您不能添加实际属性(它们被烧录到 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,您从哪里得知它将为每个实例创建一个额外的程序集?它确实做到了,但我无法在文档中找到它。
【解决方案2】:

无法在运行时从类中添加/删除属性。

但是,可以在运行时更新 XML 序列化的工作方式,而无需编辑属性。见马克的帖子。

编辑更新

【讨论】:

    最近更新 更多