C#显式转换超类到派生类并获取特定变量

时间:2016-02-05 17:31:29

标签: c# inheritance

我有一个抽象类,Tile。 我有另一个类,WebTile,继承了Tile类。 WebTile有一个private string html,而Tile没有。

 public abstract class Tile
{
    private string name;
    private string description;

    public string Name
    {
        get { return name; }
    }

    public string Description
    {
        get { return description; }
    }

    protected Tile(string name, string description)
    {
        this.name = name;
        this.description = description;
    }
}

 public class WebTile : Tile
    {
        private string html;
        public string HTML
        {
            get { return html; }
        }
        public WebTile(string name, string description, string html) : base(name, description)
        {
            this.html = HTML;
        }
    }

我有一个返回Tiles (List<Tile>)

列表的方法

我循环遍历列表,并将类型为WebTile的Tiles转换为WebTile。

然后我想得到html-string。但演员阵容后它变得空洞了?!我错过了什么?

foreach (Tile tile in xmlparser.GetTiles())
            {
                switch (tile.GetType().ToString())
                {
                    case "Dashboard.Tiles.WebTile":
                        WebTile _tile = tile as WebTile;
                        sb.Append("<div class=\"panel panel-default\">");
                        sb.Append("<div class=\"panel-heading\">" + _tile.Name + "</div>");
                        sb.Append("<div class=\"panel-body\">");
                        sb.Append(_tile.HTML); // <--- THIS IS EMPTY!!
                        sb.Append("</div>").Append("</div>");
                        break;
                    default:
                        break;
                }
             }

2 个答案:

答案 0 :(得分:2)

您可以使用Linq的OfType方法,而不是关闭完全限定的类型名称:

foreach (WebTile tile in xmlparser.GetTiles().OfType<WebTile>())
{
    sb.Append("<div class=\"panel panel-default\">");
    sb.Append("<div class=\"panel-heading\">" + tile.Name + "</div>");
    sb.Append("<div class=\"panel-body\">");
    sb.Append(tile.HTML); 
    sb.Append("</div>").Append("</div>");
 }

但你的构造函数是错误的 - 你正在从属性中分配私有字段,而不是传入的参数:

public WebTile(string name, string description, string html) : base(name, description)
{
    this.html = html;  // not HTML
}

答案 1 :(得分:1)

public class WebTile : Tile
    {
        private string html;
        public string HTML
        {
            get { return html; }
        }
        public WebTile(string name, string description, string html) : base(name, description)
        {
         //wronge
         // this.html = HTML;
         //correct
         this.html = html;
        }
    }