在运行时更改方法属性

时间:2014-01-15 21:10:11

标签: c# reflection

我正在尝试将对象序列化为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”

1 个答案:

答案 0 :(得分:2)

该文章中的技术仅适用于依赖于TypeDescriptor系统的.NET组件,这是一种比原始反射更高级别的抽象。据我所知,XmlSerializer不是其中一个组成部分。

关于XmlSerializer,您最接近“在运行时更改属性”的方法是使用XmlAttributeOverrides,但我忘了如何使用它,因为我很少使用它。这只允许您为整个类型更改它们,而不是您想要的单个实例。这部分是因为XmlSerializer实际上在内部编译了一个序列化委托,它为了提高性能而反复使用它来序列化你的类型。

您最好的选择可能只是实现IXmlSerializable接口来自定义该特定类的序列化。 XmlSerializer将尊重该界面,并允许您使用XmlReader / XmlWriter 100%控制XML。手动编写序列化代码更加困难,但是你有更多的控制权。而且您只需要为图表中需要自定义处理的类型执行此操作。有关使用IXmlSerializable的示例,请参阅我对Override XML Serialization Method的回答。

相关问题