如何将对象转换为继承类?

时间:2013-05-04 08:15:53

标签: c# linq-to-xml

说我有:

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

然后我有一个名为Tigers的XDoucment,我该如何做:

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中的引用。

1 个答案:

答案 0 :(得分:1)

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

但是,您可以使用构图:

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对象。)