У меня объявлен следующий общий пользовательский элемент управления:
public partial class MessageBase<T> : UserControl
{
protected T myEntry;
public MessageBase()
{
InitializeComponent();
}
public MessageBase(T newEntry)
{
InitializeComponent();
myEntry = newEntry;
}
}
}
Но компилятор мне этого не позволяет:
public partial class MessageControl : MessageBase<Post>
{
public MessageControl()
{
InitializeComponent();
}
}
Как создать общий пользовательский элемент управления на C#?





Во-первых, хотя общие элементы управления возможны в .NET, дизайнеры Visual Studio не поддерживают их, так что вы сами по себе, если хотите их использовать. Вам придется самостоятельно создать их в своем коде и также выполнить макет.
Что касается упомянутой вами ошибки, мне кажется, что вы смотрите не в том направлении. Возможно, вы могли бы написать здесь весь текст ошибки?
Платформа .NET поддерживает их, но, как отмечает Вилкс, дизайнеры просто не поддерживают их - и любая из платформ на основе xml / разметки (xaml (wpf) или ASP.NET) вообще не любит дженерики. Так что лучший совет: не используйте их.
Обычный компромисс - иметь свойство Type (или свойство шаблона object, на основании которого вы вызываете GetType()) и просто приводить и т. д. Внутри элемента управления. Аналогичным образом, при таком использовании обычно используются такие вещи, как Activator.CreateInstance и TypeDescriptor (для поиска метаданных и т. д.).
Спасибо. Но это любопытная оплошность.
См. Ответ Роберта Вуда. Это способ обойти эту конкретную проблему и по-прежнему использовать конструктор. Несмотря на то, что это обходной путь, это намного лучше, чем использование свойства Type.
Попробуй это
public partial class MessageControl : MessageControlBase
{
public MessageControl()
{
InitializeComponent();
}
}
public class MessageControlBase : MessageBase<Post>
{}
Ключ к тому, чтобы заставить конструктора работать, заключается в том, что базовый класс класса, который вы редактируете, не должен быть универсальным.
Да, дизайнер - «тупой» экземпляр. Он может создавать только конкретные классы - не абстрактные, не общие. Это верно как для базового класса, так и для любых элементов управления / компонентов, которые находятся в элементе управления, который вы редактируете. Надеюсь, когда-нибудь они это исправят ...
Да. это возможно. См. Ссылку ниже, чтобы получить представление.
Поставляемая ссылка мертва
Думаю, я не припомню, чтобы использовал представление дизайна на строго типизированной ViewPage в ASP.NET MVC. С этим справляется (или как) дизайнер?