0

说我有:

Class Tiger: XElement
{
    public Tiger(XElement t)
        :base(t) { }
}

然后我有一个XDoucment名为 Tigers,我该怎么做:

XElement t = Tigers.Descendants("Tiger").ElementAt(0);
(Tiger)t;
t as Tiger;

第一个给我一个异常: Cannot cast 't' (which has an actual type of 'System.Xml.Linq.XElement') to 'Zoo.Tiger'
第二个总是返回null。


我想要实现的是在 XElement 中获取引用并将其转换为Tiger.
然后我可以做这样的事情XElement.Add,可以直接影响 XDocument 中的引用。

4

1 回答 1

1

您不能为此使用继承。ElementAt 返回的对象是 XElement,而不是 Tiger,您无法更改它。如果我给你一个毛茸茸的能喵喵叫的动物,你不可能把它变成狗,即使狗是动物的子类。

但是,您可以使用组合:

Class Tiger
{
    public XElement XElement { get; private set; }

    public Tiger(XElement xelement)
    {
        this.XElement = xelement;
    }
}

用法:

XElement x = Tigers.Descendants("Tiger").ElementAt(0);
Tiger t = new Tiger(x);
t.XElement.Add(...);

(请注意,由于 XElement 是引用类型

  • t.XElement
  • x
  • Tigers.Descendants("Tiger").ElementAt(0)

将引用内存中的同一个XElement 对象。)

于 2013-05-04T08:29:51.817 回答