扩展System.Xml.Linq.XElement - 内部CloneNode

时间:2014-06-16 11:14:43

标签: c# linq-to-xml .net-4.5 xelement

我的课程Foo延长了System.Xml.Linq.XElement,但是当我致电

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

添加的儿童不属于Foo,类型为XElement

这是因为在internal abstract XNode CloneNode()方法中调用了Add

由于内部的原因,我无法覆盖这一点。在这种情况下我有什么选择?我不想覆盖调用CloneNode()的每个函数。

2 个答案:

答案 0 :(得分:0)

现在我有一个丑陋的解决方案,更像是临时黑客而不是解决方案,一般不工作,只是为了修补当前代码。我不确定是否有任何好的解决方案,除了在不扩展XElement的情况下重写代码,所以我会发布这个。

仅当父字段不为空时才在Add中调用CloneNode,但Parent属性只有get,而parent字段是internal。解决我的问题的最简单方法是在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);
}

答案 1 :(得分:0)

作为实体的XElement是XML模型本身的一部分。如果要向XML添加一些功能(如新类型的Node),则可以扩展它。即便如此,XNode实现仍然是正确的,因为它对您的新XML一无所知。据我所知,XML本身不可扩展,例如你不能添加一种新的节点。

如果您正在尝试对XML数据进行排序,那么正确的方法是单独构建数据模型并在根实体上实现读/写方法。

如果要标记元素,则必须直接从XDocument构建整个模型的包装器,或者使用Dictionary<XElement, something>索引侧面的信息。