Краткое описание : я создаю приложение MVC, в котором мне нужно отобразить документы различных типов, некоторые из которых содержат больше информации об авторе, чем другие.
Что я хочуdo : Мой подход заключается в том, чтобы иметь общее представление «Просмотр документа», которое динамически отображает документ в формате, определяемом формой / типом переданного ему объекта.
Пример : простой документ будет загружен в 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 # не поддерживает ковариацию типа возврата, но надеялся, что может быть другой способ возврата / идентификации производных типов, так что мне не придется запрашивать их все в представлении.
Моим текущим решением было бы всегда возвращать базутипы, и имеют отдельное представление для каждого конкретного типа, который просто приводит каждый объект к правильному типу, запрашивая только те, которые могут отличаться.Возможно, это лучшее решение конца, но оно выглядит очень не элегантно.