我可以在运行时向对象属性添加属性吗?
-
03-07-2019 - |
题
例如,我想删除或更改以下属性属性或添加新属性。有可能吗?
[XmlElement("bill_info")]
[XmlIgnore]
public BillInfo BillInfo
{
get { return billInfo; }
set { billInfo = value; }
}
解决方案
(编辑 - 我误解了原来的问题)
您无法添加实际属性(它们被刻录到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.CreateProperty
和 ICustomTypeDescriptor来为与数据绑定相关的事物添加属性。
或 TypeDescriptionProvider
。比xml情况复杂得多,我担心 - 并不适用于所有代码 - 只是使用组件模型的代码。
其他提示
在运行时无法在类中添加/删除属性。
但是,可以更新XML序列化在运行时的工作方式,而无需编辑属性。见Marc的帖子。
编辑已更新
不隶属于 StackOverflow