C# 在运行时更改方法属性
我正在尝试将对象序列化为xml。我已经准备好了C# 在运行时更改方法属性,c#,reflection,C#,Reflection,我正在尝试将对象序列化为xml。我已经准备好了 public class Foo<t> { [XmlElement(ElementName ="test")] public <t> bar { get { var descriptor = TypeDescriptor.GetProperties(this.GetType())["bar"]; var attrib =(XmlElementAttribute
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{}
}
公共类Foo
{
[xmlement(ElementName=“test”)]
公共酒吧{
得到
{
var descriptor=TypeDescriptor.GetProperties(this.GetType())[“bar”];
var attrib=(xmlementattribute)descriptor.Attributes[typeof(xmlementattribute)];
FieldInfo ElementName=attrib.GetType().GetProperty(“ElementName”)
ElementName.SetValue(attrib,“success”);
}
集合{}
}
我想在运行时更改XmlElement.ElementName,但到目前为止尚未成功。
据我所知,你应该能够做到。这也表明我在正确的轨道上
我的问题是,我想做什么是可能的?我如何做到这一点?
编辑:
我希望xml节点被称为“Success”,而不是“test”这篇文章中的技术只适用于依赖于
TypeDescriptor
系统的.NET组件,后者是比原始反射更高级别的抽象。XmlSerializer
就我所知不是这些组件之一
最接近“在运行时更改属性”关于XmlSerializer
正在使用XmlAttributeOverrides
,但我忘记了如何使用它,因为我很少使用它。这只允许您为整个类型更改它们,而不是您希望的单个实例。这部分是因为XmlSerializer
实际上编译了序列化在内部委托,出于性能原因,它会反复使用它来序列化您的类型
您最好的选择可能是只实现
IXmlSerializable
接口来定制特定类的序列化。XmlSerializer
将尊重该接口,它将允许您通过使用XmlReader
/XmlWriter
对XML进行100%的控制手动编写序列化代码,但您有更多的控制权。您只需对图形中需要自定义处理的类型执行此操作。有关使用IXmlSerializable
的示例,请参阅我的答案。ElementName
可能是一个属性,而不是字段,因此请尝试GetProperty(“ElementName”)
相反。您是对的GetProperty导致了非空。但是在序列化过程中,我收到的是“Test”而不是“Success”,请用新错误更新问题。是的,XmlAttributeOverrides是正确的方法。请参阅例如。