c# - 从派生类中获取特定类型
问题描述
简介:我正在创建一个 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,但希望可能有另一种返回/识别派生类型的方法,这样我就不必在视图中查询它们。
我当前的解决方案是始终返回基本类型,并为每个具体类型提供一个单独的视图,该视图只是将每个对象转换为正确的类型,只查询那些可能不同的对象。也许这是最好的解决方案,但感觉很不雅。
解决方案
通常你可以做一个简单的“是”检查。因此,您可以在视图中进行条件渲染,例如:
@if(Model is ExtendedDocumentViewModel)
{
// render ExtendedDocumentViewModel html here
}
类型检查通常被认为是一种反模式,但是我不确定是否有更好的方法来解决这个问题。如果您使用的是 .NET Core,您还可以在此处查看子类标记http://examples.aspnetcore.mvc-controls.com/InputExamples/SubClass。
推荐阅读
- swift - 在 Swift 中使用 Firebase 发送确认电子邮件
- javascript - Buefy 表后端排序似乎不起作用
- php - 如何使用 Javascript 从 URL 访问 JSON 并将数据提取到刀片中
- objective-c - Objective-C 相当于 Swift "\(variable)"
- sqlite - 如何使用 SQlite 在 QTableView 上声明负数
- reactjs - 在 es6 中计算内部地图
- javascript - 在“reactstrap”导航栏中使用“折叠”时“无法将未定义或空值转换为对象”
- python - 如何根据值更改条形图的颜色?
- c# - DateTime.ParseExact 无法按预期工作
- excel - 为什么 VBA 不允许我在用户窗体的命令按钮中声明公共数组?