2010-03-10 26 views
1

我必須動態地分配和改變複雜的對象使用System.Xml.Serialization.XmlAttributeOverrides你能在C#遍歷XmlAttributeOverrides收集

到目前爲止,我已經能夠做的一切,我需要在運行時屬性。

我的一個問題是如何遍歷集合來查看已經添加的內容?

如果我不能通過這個集合進行交互,我可以加入兩個XmlAttributeOverrides集合以形成一個完整集合。

謝謝

回答

0

不方便,沒有。

您可以通過使用索引獲取類型,您預計價值 - 無論是yourOverrides[type]yourOverrides[type, memberName] - 但得到的列表中的所有裏面的數據就需要反思(它沒有暴露在API)。

通過檢查(雖然這是脆),有一種叫做types字段是一個Hashtable(由Type鍵控)。 Hashtable中的每個對象都是本身 a Hashtable(由成員名稱鍵入,""爲類型自己的設置)。

祝你好運,如果它落在一大堆,當你應用一些修補程序或新的.NET版本不要怪我......

1

您可以創建一個XmlAttributeOverridesBuilder類,類似於XmlAttributeOverrides,這將讓您更好地控制它所包含的XmlAttributes。這樣,您可以在XmlAttributeOverridesBuilder實例上工作,如果需要將它們組合在一起,並在需要實際的XmlAttributeOverrides實例時調用GetOverrides方法。

public class XmlAttributeOverridesBuilder 
{ 
    private Dictionary<Type, Dictionary<string, XmlAttributes>> _entries; 

    public XmlAttributeOverridesBuilder() 
    { 
     _entries = new Dictionary<Type, Dictionary<string, XmlAttributes>>(); 
    } 

    public void Add(Type type, XmlAttributes attributes) 
    { 
     Add(type, String.Empty, attributes); 
    } 

    public void Add(Type type, string member, XmlAttributes attributes) 
    { 
     Dictionary<string, XmlAttributes> typeEntries; 
     if (!_entries.TryGetValue(type, out typeEntries)) 
     { 
      typeEntries = new Dictionary<string, XmlAttributes>(); 
      _entries[type] = typeEntries; 
     } 
     typeEntries[member] = attributes; 
    } 

    public XmlAttributeOverrides GetOverrides() 
    { 
     XmlAttributeOverrides overrides = new XmlAttributeOverrides(); 
     foreach(var kvpType in _entries) 
     { 
      foreach(var kvpMember in kvpType.Value) 
      { 
       overrides.Add(kvpType.Key, kvpMember.Key, kvpMember.Value); 
      } 
     } 
     return overrides; 
    } 

    public XmlAttributeOverridesBuilder Combine(XmlAttributeOverridesBuilder other) 
    { 
     // combine logic to build a new XmlAttributeOverridesBuilder 
     // ... 
    } 
}