Я хотел бы определить следующий элемент управления:
public partial class ObjectSelectorControl<T> : UserControl where T : class
Проблема заключается в том, что разработчик не может решить эту проблему. Есть ли способ обхода проблемы?
Я хотел бы определить следующий элемент управления:
public partial class ObjectSelectorControl<T> : UserControl where T : class
Проблема заключается в том, что разработчик не может решить эту проблему. Есть ли способ обхода проблемы?
Это работает
public class Control1<T> : UserControl { ... } public class Control2 : Control1<double> { ... } public class Control3 : Control2 { ... }
прочитал его здесь:
http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/0c265543-d6f0-41f6-beeb-b89e0071c5c3
Похоже на то, что мы делаем в нашем проекте.
Существует базовый класс, который является общим:
public partial class controlItemList<TBaseItem, TBaseItemCollection> : UserControl, IUIDispatcher
where TBaseItem : new()
where TBaseItemCollection : IItemCollection<TBaseItem>
Затем для каждого использования мы определяем не общий вариант (который еще не может быть использован дизайнером):
public class controlMessagesNonGenericParent : controlItemList<MailItem, MailItemCollection>
{
}
... и затем мы получили элементы управления, которые можно использовать в конструкторе:
public partial class controlMessages : controlMessagesNonGenericParent
{
...
}
Есть некоторые ограничения на то, что ваш контроль может или не может сделать, чтобы иметь возможность использовать конструктор. В сущности, все они вращаются вокруг дизайнера, способного создать экземпляр вашего класса (должен иметь конструктор без параметров, не может быть abstract
и т.д.). Поскольку разработчик понятия не имеет, какой тип передать как общий аргумент (и я сомневаюсь, что это даже соображение), ваш класс не может быть создан.
Лучшей надеждой было бы создать UserControl
и сменить конструктор на protected
(это, я считаю, будет работать, поскольку дизайнер использует отражение и игнорирует видимость, но я не на 100% положителен). Затем вы можете наследовать от этого UserControl
и создать свой общий класс и вызвать базовый конструктор (protected
).
Я не считаю, что это возможно, потому что дизайнер вызывает экземпляр вашего класса. Если вы используете дженерики, дизайнер не знает, какой тип перейдет в "T".
https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=105876
Ошибка была отправлена на сайт microsoft, и вы можете видеть, что его отмеченный как "Отложенный" в настоящее время нет решения!!.
Используйте состав вместо дженериков. Вместо использования ObjectSelectorControl укажите общий элемент другого типа (возможно, Selector<T>
) и действуйте на этом объекте, вместо того чтобы пытаться заставить себя быть общим.