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

C# 我可以在运行时向对象属性添加属性吗?,c#,serialization,attributes,C#,Serialization,Attributes,例如,我想删除或更改以下属性属性或添加新属性。可能吗 [XmlElement("bill_info")] [XmlIgnore] public BillInfo BillInfo { get { return billInfo; } set { billInfo = value; } } (编辑-我误读了原始问题) 您不能添加实际属性(它们被烧录到IL中);但是,使用XmlSerializer您不必-您可以在构造函数中为XmlSerializer提供附加属性。但是,如果执行此操作,则需

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

[XmlElement("bill_info")]
[XmlIgnore]
public BillInfo BillInfo
{
  get { return billInfo; }
  set { billInfo = value; }
}
(编辑-我误读了原始问题)

您不能添加实际属性(它们被烧录到IL中);但是,使用
XmlSerializer
您不必-您可以在构造函数中为
XmlSerializer
提供附加属性。但是,如果执行此操作,则需要稍微小心地缓存
XmlSerializer
实例,否则它将为每个实例创建一个额外的程序集,这有点泄漏。(如果使用只接受
类型的简单构造函数
,则不会执行此操作)。看

例如:

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情况复杂得多——并且不适用于所有代码——只适用于使用组件模型的代码。

不可能在运行时从类中添加/删除属性

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


编辑更新

出于兴趣,为什么它同时标记为XmlIgnore和XmlElement?Marc,您从哪里得到它将为每个实例创建额外程序集的信息?确实是这样,但我在文件上找不到。