当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《我可以在运行时向对象属性添加属性吗?》经验,为你挑选了1个好方法。

例如,我想删除或更改下面的属性属性或添加一个新属性.可能吗?

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

Marc Gravell.. 14

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

您无法添加实际属性(它们被刻录到IL中); 但是,XmlSerializer您不必 - 您可以在构造函数中提供其他属性XmlSerializer.但是,XmlSerializer如果你这样做,你需要小心地缓存实例,否则它将为每个实例创建一个额外的程序集,这有点漏洞.(如果你使用只需要a的简单构造函数,它就不会这样做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.CreateProperty和或者为ICustomTypeDescriptor或者添加与数据绑定相关的事物的属性TypeDescriptionProvider.比xml情况复杂得多,我担心 - 并不适用于所有代码 - 只是使用组件模型的代码.



1> Marc Gravell..:

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

您无法添加实际属性(它们被刻录到IL中); 但是,XmlSerializer您不必 - 您可以在构造函数中提供其他属性XmlSerializer.但是,XmlSerializer如果你这样做,你需要小心地缓存实例,否则它将为每个实例创建一个额外的程序集,这有点漏洞.(如果你使用只需要a的简单构造函数,它就不会这样做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.CreateProperty和或者为ICustomTypeDescriptor或者添加与数据绑定相关的事物的属性TypeDescriptionProvider.比xml情况复杂得多,我担心 - 并不适用于所有代码 - 只是使用组件模型的代码.

推荐阅读
雨天是最美
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有