C # generics usercontrol - PullRequest
       21

C # generics usercontrol

25 голосов
/ 25 августа 2009

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

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

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

Ответы [ 7 ]

35 голосов
/ 25 августа 2009

Это работает

public class Control1<T> : UserControl { ... }

public class Control2 : Control1<double> { ... }

public class Control3 : Control2 { ... }

прочитал это здесь:

Общие элементы управления пользователя?

10 голосов
/ 25 августа 2009

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

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

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
{
...
}
1 голос
/ 25 августа 2009

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

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

0 голосов
/ 13 июля 2018

Я не знаю, в какой момент (с какой версией C # /. NET / VS обновляется версия), но теперь можно создать универсальный элемент управления так же, как и любой другой универсальный класс.

Если вы создаете UserControl в VS стандартным способом (то есть, добавляя его через GUI), вы просто добавляете <T> в обе части объявления класса («базовый» код класса и файл, управляемый дизайнером). На самом деле, это то, что у вас есть в вашем цитируемом коде.

0 голосов
/ 25 августа 2009

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

0 голосов
/ 25 августа 2009

https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=105876

Ошибка была опубликована на сайте Microsoft, и вы можете видеть, что она помечена как «Отложено», и в настоящее время нет решения !! .

0 голосов
/ 25 августа 2009

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

...