c# - 从派生类获取特定类型

标签 c# asp.net-mvc inheritance polymorphism covariance

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

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

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

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

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

问题:所以我的问题是;如何最好地从完全实现的类中获取特定类型,或者我是否需要返回基本类型并在 View 中查询所有类型?还是我疯了,需要重新开始?

编辑:

我知道c# doesn't support return type covarience ,但希望可能有另一种方法来返回/识别派生类型,这样我就不必在 View 中查询它们。

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

最佳答案

通常您可以做一个简单的"is"检查。因此,您可以在 View 中进行条件渲染,例如:

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

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

关于c# - 从派生类获取特定类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50821296/

相关文章:

jquery - 自动更新ASP.NET中的内容

javascript - 设置输入类型=日期

entity-framework-4 - 扩展 Core Edmx,EF4 中的多个 Edmx

javascript - 如何使用 JavaScript 使 Repeater 内的 TextArea 在单击按钮时显示?

c# - 单击 gridview 按钮时页面不刷新

asp.net-mvc - MVC OAUTH VS2012模板,redirect_uri在哪里输入?

c++ - 虚拟继承对构造函数的影响

c# - Selenium 中的测试 slider 只有一个元素,如音量控制

c# - 如何一劳永逸地从 VS Team Services 构建到 Azure Web 应用程序?

Python 从一个类继承但覆盖调用另一个类的方法?