Можно ли сделать общий элемент управления в .Net 3.5? - PullRequest
10 голосов
/ 27 декабря 2008

У меня объявлен следующий общий пользовательский контроль:

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 #?

Ответы [ 4 ]

16 голосов
/ 28 декабря 2008

Попробуйте это

public partial class MessageControl : MessageControlBase
{    
    public MessageControl()    
    {
        InitializeComponent();    
    }
}

public class MessageControlBase : MessageBase<Post>
{}

Ключом к тому, чтобы заставить дизайнера работать, является то, что базовый класс редактируемого вами класса не должен быть универсальным.

2 голосов
/ 05 января 2010

Да. возможно. Смотрите ссылку ниже, чтобы получить представление.

https://web.archive.org/web/20130603104810/http://www.hackersbasement.com/csharp/post/2009/08/29/Generic-Control-Builder-in-ASPNet.aspx

1 голос
/ 27 декабря 2008

.NET Framework поддерживает их, но, как отмечает Vilx, разработчики просто не делают этого - и любая из платформ на основе xml / markup (xaml (wpf) или ASP.NET) вообще не будет любить дженерики. Поэтому лучший совет: не используйте их.

Распространенным компромиссом является наличие свойства Type (или свойства шаблона object, для которого вы вызываете GetType()), и просто приведение и т. Д. Внутри элемента управления. Аналогичным образом, при таком использовании обычно используются такие вещи, как Activator.CreateInstance и TypeDescriptor (для поиска метаданных и т. Д.).

1 голос
/ 27 декабря 2008

Во-первых, хотя в .NET возможны общие элементы управления, разработчики Visual Studio не поддерживают их, поэтому вы можете использовать их самостоятельно. Вам придется создавать их сами в своем коде и выполнять компоновку.

Что касается упомянутой вами ошибки, для меня это звучит так, будто вы смотрите не в ту сторону. Возможно, вы могли бы написать полный текст ошибки здесь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...