Подтвердить что ты не робот

С# generics usercontrol

Я хотел бы определить следующий элемент управления:

public partial class ObjectSelectorControl<T> : UserControl where T : class 

Проблема заключается в том, что разработчик не может решить эту проблему. Есть ли способ обхода проблемы?

4b9b3361

Ответ 2

Похоже на то, что мы делаем в нашем проекте.

Существует базовый класс, который является общим:

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
{
...
}

Ответ 3

Есть некоторые ограничения на то, что ваш контроль может или не может сделать, чтобы иметь возможность использовать конструктор. В сущности, все они вращаются вокруг дизайнера, способного создать экземпляр вашего класса (должен иметь конструктор без параметров, не может быть abstract и т.д.). Поскольку разработчик понятия не имеет, какой тип передать как общий аргумент (и я сомневаюсь, что это даже соображение), ваш класс не может быть создан.

Лучшей надеждой было бы создать UserControl и сменить конструктор на protected (это, я считаю, будет работать, поскольку дизайнер использует отражение и игнорирует видимость, но я не на 100% положителен). Затем вы можете наследовать от этого UserControl и создать свой общий класс и вызвать базовый конструктор (protected).

Ответ 4

Я не считаю, что это возможно, потому что дизайнер вызывает экземпляр вашего класса. Если вы используете дженерики, дизайнер не знает, какой тип перейдет в "T".

Ответ 6

Используйте состав вместо дженериков. Вместо использования ObjectSelectorControl укажите общий элемент другого типа (возможно, Selector<T>) и действуйте на этом объекте, вместо того чтобы пытаться заставить себя быть общим.