簡體   English   中英

擴展System.Xml.Linq.XElement-內部CloneNode

[英]Extending System.Xml.Linq.XElement - internal CloneNode

我有Foo擴展System.Xml.Linq.XElement類,但是當我打電話時

Foo parent = ..; Foo child = ..; parent.Add(child);

添加的child不是Foo類型,而是XElement類型。

這是因為internal abstract XNode CloneNode()Add方法內部被調用。

由於內部原因,我無法覆蓋它。 在這種情況下,我有什么選擇? 我不想重寫每個調用CloneNode()函數。

現在,我有一個丑陋的解決方案,更像是臨時破解而不是解決方案,它不能正常工作,只是為了修補當前代碼。 除了不擴展XElement即可重寫代碼外,我不確定是否有任何不錯的解決方案,因此我將在此發布。

僅當父字段不為null,但Parent屬性只有get且父字段為內部時,才在Add中調用CloneNode。 解決問題的最簡單方法是在XElementExtended中將XElement Add隱藏起來:

static FieldInfo parentProperty = typeof(XElementExtended).GetField("parent",
            BindingFlags.NonPublic | BindingFlags.Instance);
public void Add(XElementExtended element)
{
    var el = new XElementExtended(element);
    parentProperty.SetValue(el, null);
    base.Add(el);
}

XElement作為實體是XML模型本身的一部分。 如果您要向XML添加某些功能(如新型Node),則可以對其進行擴展。 即使這樣,XNode實現仍然是正確的,因為它對您的新XML完全一無所知。 據我所知,XML本身是不可擴展的,例如,您不能添加新的節點。

如果您要鍵入XML數據,那么正確的方法將是分別構建數據模型並在根實體上實現讀/寫方法。

如果要標記元素,則必須直接從XDocument圍繞整個模型構建包裝器,或者使用Dictionary<XElement, something>在側面索引信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM