我的课程Foo
延长了System.Xml.Linq.XElement
,但是当我致电
Foo parent = ..;
Foo child = ..;
parent.Add(child);
添加的儿童不属于Foo
,类型为XElement
。
这是因为在internal abstract XNode CloneNode()
方法中调用了Add
。
由于内部的原因,我无法覆盖这一点。在这种情况下我有什么选择?我不想覆盖调用CloneNode()
的每个函数。
答案 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>
索引侧面的信息。