首页 > 解决方案 > 从派生类中获取特定类型

问题描述

简介:我正在创建一个 MVC 应用程序,我需要在其中显示各种类型的文档,其中一些包含比其他更多的作者信息。

我想做的:我的方法是有一个通用的“查看文档”视图,它以传递给它的对象的形状/类型所规定的格式动态显示文档。

示例:一个简单的文档将被加载到 SimpleDocumentViewModel 中,并显示为这样。但是,我想将更大类型的文档加载到 ExtendedDocumentViewModel 中,并附带有关文档和作者的附加信息。然后,视图将根据其接收到的对象显示适当的数据。

我现在所处的位置:本着这种精神,我创建了以下接口和类,但我不知道如何在派生类中返回/识别更具体的返回类型。

abstract class BaseDocumentViewModel : DocumentViewModel, IDocumentViewModel
{
    public int DocumentId { get; set; }
    public string Body { get; set; }
    public IAuthorViewModel Author { get; set; }
}

class SimpleDocumentViewModel : BaseDocumentViewModel
{
}

class ExtendedDocumentViewModel : BaseDocumentViewModel
{
    public new IAuthorExtendedViewModel Author { get; set; }
}

interface IAuthorViewModel
{
    int PersonId { get; set; }
    string Name { get; set; }
}

interface IAuthorExtendedViewModel : IAuthorViewModel
{
    int ExtraData { get; set; }
    int MoreExtraData { get; set; }
}

问题:所以我的问题是;如何最好地从完全实现的类中获取特定类型,或者我是否需要返回基本类型并在视图中全部查询?还是我疯了,需要回到绘图板上?

编辑:

我知道c# 不支持返回类型 covarience,但希望可能有另一种返回/识别派生类型的方法,这样我就不必在视图中查询它们。

我当前的解决方案是始终返回基本类型,并为每个具体类型提供一个单独的视图,该视图只是将每个对象转换为正确的类型,只查询那些可能不同的对象。也许这是最好的解决方案,但感觉很不雅。

标签: c#asp.net-mvcinheritancepolymorphismcovariance

解决方案


通常你可以做一个简单的“是”检查。因此,您可以在视图中进行条件渲染,例如:

@if(Model is ExtendedDocumentViewModel)
{
  // render ExtendedDocumentViewModel html here
}

类型检查通常被认为是一种反模式,但是我不确定是否有更好的方法来解决这个问题。如果您使用的是 .NET Core,您还可以在此处查看子类标记http://examples.aspnetcore.mvc-controls.com/InputExamples/SubClass


推荐阅读