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

本文关键字:获取 变量 派生 超类 转换 | 更新日期: 2023-09-27 18:33:21

我有一个抽象类,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;
        }
    }

我有一个返回磁贴列表的方法(List<Tile>)

我遍历列表,并将 WebTile 类型的 Tile 强制转换为 WebTile。

然后我想获取 html 字符串。但是演员阵容过后就变得空了?!我错过了什么?

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;
                }
             }

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

可以使用

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
}
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;
        }
    }