2014-01-15 49 views
0

我想將對象序列化爲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但至今一直unsucessfull。 根據this blog你應該可以做到這一點。另外這SO post表明我在正確的軌道上。

我的問題是是我想做的可能嗎?我如何實現這一目標?

編輯: 我想要的XML節點被調用,而不是「測試」

+1

'ElementName'可能是一個屬性,而不是字段,所以請改用'GetProperty(「ElementName」)'。 – vcsjones

+0

你是正確的GetProperty導致非null。但在序列化我收到「測試」,而不是「成功」 – gh9

+0

請更新與新的錯誤的問題。 – rae1

回答

2

那篇文章中的技術只適用於依賴於TypeDescriptor系統,這是對.NET組件「成功」比原始反射更高層次的抽象。據我所知,XmlSerializer不是其中的一個組件。

最接近你可以在「運行時改變屬性」方面使用XmlSerializer正在使用XmlAttributeOverrides,但我忘記了如何使用它,因爲我很少使用它。這隻允許你爲整個類型改變它們,而不是你想要的單個實例。這部分是因爲XmlSerializer實際上是在內部編譯一個序列化委託,它反覆使用以序列化您的類型以達到性能。

最好的辦法就是實現IXmlSerializable接口來定製該特定類的序列化。 XmlSerializer將遵守該接口,並允許您通過使用XmlReader/XmlWriter對XML進行100%的控制。手動編寫序列化代碼更加困難,但您擁有更多的控制權。而且你只需要爲圖表中需要自定義處理的類型來完成。有關使用IXmlSerializable的示例,請參閱我對Override XML Serialization Method的回答。

+0

是的,XmlAttributeOverrides是要走的路。見例如[這個問題](http://stackoverflow.com/questions/2247086/how-to-override-xml-element-name-for-collection-elements-using-xmlattributeoverr)。 –

+0

一噸多的工作,但謝謝! – gh9