Тестирование, если Тип был зарегистрирован в Единице

FromPyObject предназначен для использования типами, которые могут быть извлечены из мира Python. Вот почему я думаю, что вы пытались написать fn to_blocks(list: Vec) -> Vec вместо fn to_blocks(list: Vec) -> Vec. Если это так, давайте перейдем к цепочке реализации.

FromPyObject имеет реализацию по умолчанию для any & amp; T, которая реализует PyTryFrom , а PyTryFrom имеет реализацию по умолчанию для любого T, который реализует PyTypeInfo . [pyclass] реализует PyObjectAlloc или PyObjectWithFreeList в соответствии с методом impl_class , и обе черты имеют ограниченную черту PyTypeInfo. Следовательно, ваш класс / структура будет отлично работать со ссылками, например :

#[pyfunction]
fn to_blocks(list: Vec<&Block>) -> Vec

Вы можете увидеть в официальной документации это объяснение в обобщенном виде.

FromPyObject реализован различными типами, которые могут быть извлечены из объекта Python , ссылка .

BLOCKQUOTE>

7
задан johnc 25 January 2009 в 01:40
поделиться

2 ответа

Unity 2.0 будет иметь метод IsRegistered , который можно использовать, чтобы узнать, был ли тип зарегистрирован в контейнере.

Первая бета-версия Unity 2.0 доступна на Codeplex с 10 февраля. См. Примечания к выпуску и загрузите его здесь; http://unity.codeplex.com/wikipage?title=Unity2%20Beta1

ОБНОВЛЕНИЕ:

Скачал и протестировал Unity 2.0 beta 1 27 февраля 2010 года, и на данный момент она еще не готова к производству. Если вы используете Unity 1.2 сегодня, вам придется проделать большую работу, чтобы заставить Unity 2.0 работать из-за неполного (?) Интерфейса IUnityContainer. Итак, если вы хотите, чтобы метод IsRegistered работал сегодня, вы можете создать такой метод расширения:

public static class UnityContainerExtensions
{
    public static bool IsRegistered<T>(this IUnityContainer container)
    {
        try
        {
            container.Resolve<T>();
            return true;
        }
        catch
        {
            return false;
        }
    }
}

Обратите внимание, что я не использую здесь ResolveAll . Причина в том, что ResolveAll не будет возвращать регистрацию по умолчанию (без имени), как указано в документации Unity:

Этот метод полезен, если вы зарегистрировали несколько типов с одним и тем же типом, но разные имена.

Имейте в виду, что этот метод НЕ возвращает экземпляр для регистрации по умолчанию (без имени).

12
ответ дан 6 December 2019 в 15:32
поделиться

Ваша только другая опция (в настоящее время) состоит в том, чтобы использовать ResolveAll<T>() и перечислите результаты.

2
ответ дан 6 December 2019 в 15:32
поделиться
Другие вопросы по тегам:

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