这是我正在研究的.net MVC项目
我有以下课程:
public abstract class TemplateBase
{
public abstract string TemplateName { get; }
public string RuntimeTypeName { get { return GetType().FullName; } }
}
和从中继承的2个类:
public class TwoColumnTemplate : TemplateBase
{
public override string TemplateName { get { return "Two-column page"; } }
public AreaContainer LeftColumn { get; protected set; }
public AreaContainer RightColumn { get; protected set; }
public TwoColumnTemplate()
{
LeftColumn = new AreaContainer("Left column");
RightColumn = new AreaContainer("Right column");
}
}
public class SingleColumnTemplate : TemplateBase
{
public override string TemplateName { get { return "Single-column page"; } }
public AreaContainer CenterColumn { get; protected set; }
public SingleColumnTemplate()
{
CenterColumn = new AreaContainer("Center column");
}
}
以及用于显示/修改html内容的contentpage类
public class ContentPage
{
public virtual int ContentPageId { get; set; }
public virtual string Title { get; set; }
public TemplateBase Template { get; set; }
}
现在的问题。我已经创建了一个绑定ContentPage的模型绑定器,我确实将数据提供给我的ActionResult,如下所示:
[HttpPost]
public ActionResult Edit(ContentPage row)
{
return this.View(row);
}
行确实有正确的数据,但我无法访问左列或右列数据,因为抽象类TemplateBase。要进行clerify是否有办法将“row”对象动态转换为正确的类(SingleColumn或TwoColumn)类型?
而不是使用if / else是否有更好的方法?也许使用反射? 感谢
[HttpPost]
public ActionResult Edit(ContentPage row)
{
var sb = new StringBuilder();
if (row.Template.RuntimeTypeName == "TwoColumn")
{
TwoColumnTemplate template = (TwoColumnTemplate)row.Template;
}
else
{
SingleColumnTemplate template = (SingleColumnTemplate)row.Template;
}
return this.View(row);
}
答案 0 :(得分:4)
您根本不需要RuntimeTypeName
属性。进行类型测试的正确方法是这样的:
if (row.Template is TwoColumnTemplate)
{
TwoColumnTemplate template = (TwoColumnTemplate)row.Template;
}
else if (row.Template is SingleColumnTemplate)
{
SingleColumnTemplate template = (SingleColumnTemplate)row.Template;
}
然而,这为正确的OO设计而尖叫。如果你有一个类的层次结构,并且你一直在测试某个对象是否属于某个类,你的类模型会严重破坏。
也许你的模板类本身应该通过抽象方法发出自己的HTML或查看状态对象?类型系统为您提供解决此问题所需的全部功能,无需测试对象是否为特定类型。