Дженерики C# usercontrol

Документация для них в http://docs.python.org/3.0/c-api/typeobj.html и , http://docs.python.org/3.0/extending/newtypes.html описывает, как сделать Ваш собственный тип.

tp_alloc делает выделение памяти низкого уровня для экземпляра. Это эквивалентно malloc (), плюс инициализируют refcnt к 1. Python имеет свое собственное средство выделения, PyType_GenericAlloc, но тип может реализовать специализированное средство выделения.

tp_new совпадает с Python __ новый __. Это обычно используется для неизменных объектов, где данные хранятся в самом экземпляре, по сравнению с указателем на данные. Например, строки и кортежи хранят свои данные в экземпляре, вместо того, чтобы использовать символ * или PyTuple *.

Для этого случая, tp_new выясняет, сколько памяти необходимо, на основе входных параметров, и называет tp_alloc для получения памяти, затем инициализирует существенные поля. tp_new не должен называть tp_alloc. Это может, например, возвратить кэшируемый объект.

tp_init совпадает с Python __ init __. Большая часть Вашей инициализации должна быть в этой функции.

различие между __ новый __ и __ init __ называют двухэтапная инициализация , или двухфазная инициализация .

Вы говорите" , C++ просто имеет новый ", но это не корректно. tp_alloc соответствует, пользовательское средство выделения арены в C++, __ новый __ соответствует пользовательскому средству выделения типа (функция фабрики), и __ init __ больше похож на конструктора. Та последняя ссылка обсуждает больше о параллелях между стилем Python и C++.

Также читает http://www.python.org/download/releases/2.2/descrintro/ для получения дополнительной информации о том, как __ новый __ и __ init __ взаимодействуют.

Вы пишете, что хотите "создать объект непосредственно в C++". Это довольно трудно, потому что самое меньшее необходимо будет преобразовать любые исключения Python, которые произошли во время объектного инстанцирования в исключение C++. Вы могли бы попытаться смотреть на Повышение:: Python для некоторой справки с этой задачей. Или можно использовать двухфазную инициализацию. ;)

26
задан Paul Bellora 4 December 2011 в 23:28
поделиться

6 ответов

This works

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

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

public class Control3 : Control2 { ... }

had read it here:

Generic User Controls?

35
ответ дан 28 November 2019 в 07:12
поделиться

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

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

1
ответ дан 28 November 2019 в 07:12
поделиться

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

Есть базовый класс, который является универсальным:

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
{
...
}
11
ответ дан 28 November 2019 в 07:12
поделиться

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

0
ответ дан 28 November 2019 в 07:12
поделиться

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

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

0
ответ дан 28 November 2019 в 07:12
поделиться

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

0
ответ дан 28 November 2019 в 07:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: