C# 在运行时更改方法属性

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

我正在尝试将对象序列化为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{}
}
公共类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是正确的方法。请参阅例如。