我正在尝试将对象序列化为xml。我已经设置了
public class Foo<t>
{
[XmlElement(ElementName ="test")]
public <t> bar {
get
{
var descriptor = TypeDescriptor.GetProperties(this.GetType())["bar"];
var attrib =(XmlElementAttribute)descriptor.Attributes[typeof(XmlElementAttribute)];
FieldInfo ElementName = attrib.GetType().GetProperty("ElementName")
ElementName.SetValue(attrib, "success");
}
set{}
}
我想在运行时更改XmlElement.ElementName,但到目前为止还没有成功。 根据{{3}}你应该能够做到。此this blog表示我走在正确的轨道上。
我的问题我想做的是什么?我如何实现这一目标?
修改: 我希望将xml节点称为“Success”而不是“test”
答案 0 :(得分:2)
该文章中的技术仅适用于依赖于TypeDescriptor
系统的.NET组件,这是一种比原始反射更高级别的抽象。据我所知,XmlSerializer
不是其中一个组成部分。
关于XmlSerializer
,您最接近“在运行时更改属性”的方法是使用XmlAttributeOverrides
,但我忘了如何使用它,因为我很少使用它。这只允许您为整个类型更改它们,而不是您想要的单个实例。这部分是因为XmlSerializer
实际上在内部编译了一个序列化委托,它为了提高性能而反复使用它来序列化你的类型。
您最好的选择可能只是实现IXmlSerializable
接口来自定义该特定类的序列化。 XmlSerializer
将尊重该界面,并允许您使用XmlReader
/ XmlWriter
100%控制XML。手动编写序列化代码更加困难,但是你有更多的控制权。而且您只需要为图表中需要自定义处理的类型执行此操作。有关使用IXmlSerializable
的示例,请参阅我对Override XML Serialization Method的回答。