[英]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.