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;
}
}
可以使用
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;
}
}