代码之家  ›  专栏  ›  技术社区  ›  NetSide

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

  •  11
  • NetSide  · 技术社区  · 16 年前

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

    [XmlElement("bill_info")]
    [XmlIgnore]
    public BillInfo BillInfo
    {
      get { return billInfo; }
      set { billInfo = value; }
    }
    
    2 回复  |  直到 16 年前
        1
  •  14
  •   Marc Gravell    16 年前

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

    您不能添加实际属性(它们被烧录到IL中);但是, 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; } }
    }
    

    第二 TypeDescriptor.CreateProperty 或者 ICustomTypeDescriptor TypeDescriptionProvider . 恐怕要比xml复杂得多,而且不适用于所有代码,只适用于使用组件模型的代码。

        2
  •  3
  •   JaredPar    16 年前

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

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

    编辑 更新