Допустим, у меня есть несколько классов контента, таких как Page, TabGroup, Tab и т. Д.
Некоторые из них будут реализовывать мой интерфейс IWidgetContainer - это означает, что они получат дополнительное поле с именем ContainedItems из интерфейса и некоторые методы для управления этим полем.
Теперь мне нужно отразить тот факт, что некоторые классы реализуют этот интерфейс, выдавая некоторые специальные пользовательские элементы управления в моих представлениях ASP.NET MVC (например, кнопки jQuery Add / Remove / Move / Reorder).
Например, TabGroup будет реализовывать IWidgetContainer, потому что он будет содержать вкладки, но вкладка не будет реализовывать его, потому что у него не будет возможности содержать что-либо.
Поэтому я должен как-то проверить в своем представлении, когда я рендеринг своих объектов содержимого (проблема в том, что я использую свой базовый класс как строгий тип в моем представлении, а не конкретные классы), реализует ли он IWidgetContainer.
Как это возможно, или я что-то пропустил?
Чтобы перефразировать вопрос, как вы отражаете некоторые специальные свойства класса (например, реализацию интерфейса) в пользовательском интерфейсе в целом (не обязательно ASP.NET MVC)?
Вот мой код:
[DataContract]
public class ContentClass
{
[DataMember]
public string Slug;
[DataMember]
public string Title;
[DataMember]
protected ContentType Type;
}
[DataContract]
public class Group : ContentClass, IWidgetContainer
{
public Group()
{
Type = ContentType.TabGroup;
}
public ContentList ContainedItems
{
get; set;
}
public void AddContent(ContentListItem toAdd)
{
throw new NotImplementedException();
}
public void RemoveContent(ContentListItem toRemove)
{
throw new NotImplementedException();
}
}
[DataContract]
public class GroupElement : ContentClass
{
public GroupElement()
{
Type = ContentType.Tab;
}
}
1015 * * Интерфейс:
interface IWidgetContainer
{
[DataMember]
ContentList ContainedItems { get; set; }
void AddContent(ContentListItem toAdd);
void RemoveContent(ContentListItem toRemove);
}