2009-06-24 87 views
7

假設我有以下的(平凡簡單)的基類:我可以將屬性應用於繼承的成員嗎?

public class Simple 
{ 
    public string Value { get; set; } 
} 

我現在要做到以下幾點:

public class PathValue : Simple 
{ 
    [XmlAttribute("path")] 
    public string Value { get; set; } 
} 

public class ObjectValue : Simple 
{ 
    [XmlAttribute("object")] 
    public string Value { get; set; } 
} 

但實際上不重新定義屬性。我想將屬性應用於基類的成員。這可能嗎?

真正的問題是,在我的從/到XML的序列化機制(它出色地btw),我發現很多類似的元素,只有屬性的名稱不同(他們不一致,控制格式)。現在我需要爲每個這樣的元素創建一個不同的類,而它們就像100%一樣(除了屬性)。

我不認爲這是可能的,但你可能永遠不知道。

UPDATE:

我想馬克的做法,但無濟於事:

public class Document 
{ 
    public PathValue Path; 
    public ObjectValue Object; 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var doc = new Document() 
     { 
      Path = new PathValue() { Value = "some path" }, 
      Object = new ObjectValue() { Value = "some object" } 
     }; 

     XmlAttributeOverrides overrides = new XmlAttributeOverrides(); 

     overrides.Add(typeof(PathValue), "Value", new XmlAttributes() { XmlAttribute = new XmlAttributeAttribute("path") }); 
     overrides.Add(typeof(ObjectValue), "Value", new XmlAttributes() { XmlAttribute = new XmlAttributeAttribute("object") }); 

     XmlSerializer serializer = new XmlSerializer(typeof(Document), overrides); 

     serializer.Serialize(Console.Out, doc); 

     Console.WriteLine(); 
     Console.ReadLine(); 
    } 
} 

...不會做的伎倆。

+0

我想你的意思是從Simple繼承。 – Noldorin 2009-06-24 11:51:59

+0

這是否意味着一個xml文件可以同時包含元素,這些元素應該全部序列化爲具有值屬性的值類? – Groo 2009-06-24 11:55:02

+0

他們應該序列化到派生類,顯然,元素本身的名稱取決於它的使用位置,但是,這是一般的想法。 另外,在我的應用程序中,它更常用於寫出XML而不是讀入它。 – 2009-06-24 12:05:21

回答

3

我會自己回答這個問題,以便我可以接受這個答案。我不喜歡答案,但我想這是唯一有效的答案。

答案是:不,你做不到。

2

你可能使用過載XmlSerializer的構造函數,它允許你傳遞屬性以在運行時應用?那麼你不必擔心它...

警告:你想要緩存串行器實例並重新使用它;否則(使用複雜的構造函數)每次都會動態生成類型。

例子:

using System; 
using System.Xml.Serialization; 
public class Simple { 
    public string Value { get; set; } 

    static void Main() { 
     XmlAttributeOverrides overrides = new XmlAttributeOverrides(); 
     overrides.Add(typeof(Simple), "Value", new XmlAttributes { 
      XmlAttribute = new XmlAttributeAttribute("path") 
     }); 
     XmlSerializer pathSerializer = new XmlSerializer(
      typeof(Simple), overrides); 
     // cache and re-use pathSerializer!!! 

     Simple obj = new Simple(); 
     obj.Value = "abc"; 
     pathSerializer.Serialize(Console.Out, obj); 
    } 
} 

輸出:

<Simple xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" path="abc" /> 
0

你也許是意識到了這一點,但作爲一個理念(儘管代碼結構將完全在這種情況下發生變動):

一種方法是使用自定義序列化來將基類序列化爲名 - 值對的集合(還有XDocument和類似的有用的東西來使它更容易)。雖然它沒有強制執行類型安全,但它可以免除您做大量手動工作。

我更喜歡去定製序列化,因爲它允許更廣泛的可能性(例如序列化不可變類)。有時XmlSerializer也是非常討厭的(例如我討厭添加「MyFieldSpecified」屬性來創建可選屬性)。

0

也許你可以通過一個公共映射來標記基類屬性,而不是隻覆蓋繼承類中屬性不同的地方。至少你會節省一些壓倒一切的。

1

如何:

public class Simple 
{ 
    [XmlIgnore] 
    public string Value { get; set; } 
} 

public class PathValue : Simple 
{ 
    [XmlAttribute("path")] 
    public string Path { 
      get { return base.Value != null ? base.Value : null; } 
      set { base.Value = value != null ? value : null; } 
    } 
} 

public class ObjectValue : Simple 
{ 
    [XmlAttribute("object")] 
    public string Object { 
      get { return base.Value != null ? base.Value : null; } 
      set { base.Value = value != null ? value : null; } 
    } 
} 

這是用來序列化不可序列化的類型像一個URI是發生在構造一個序列化類型相同的技術。