.net抽象类和思考

时间:2010-12-29 08:24:45

标签: asp.net-mvc

这是我正在研究的.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);
    }

1 个答案:

答案 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或查看状态对象?类型系统为您提供解决此问题所需的全部功能,无需测试对象是否为特定类型。