2015-06-04 2 views
1

Я использую библиотеку gobject-introspection-1.0 от Vala для динамической загрузки gir-модулей. Поскольку мне нужно вызвать функцию инициализации, имеющую фиксированное имя, я извлекаю объект BaseInfo из Repository.find_by_name.Как отличить компактный тип в Вала?

Теперь я хочу вызвать эту функцию с помощью GI.CallableInfo.invoke, которому нужен объект GI.CallableInfo.

К счастью, GI.CallableInfo наследует от GI.BaseInfo, а экземпляр, который я извлекаю, вероятно, является GI.CallableInfo. Поэтому я стараюсь, чтобы динамически или статически брось:

GI.CallableInfo myCallableInfo = myBaseInfo as GI.CallableInfo; 

GI.CallableInfo myCallableInfo = (GI.CallableInfo) myBaseInfo; 

GI.CallableInfo myCallableInfo = (myBaseInfo is GI.CallableInfo) 
    ? (GI.CallableInfo) myBaseInfo : null; 

Первые один приводит к ошибке компиляции:

error: Operation not supported for this type

Второй в выполнении утверждения терпят неудачу, и myCallableInfo быть нулевым:

g_boxed_copy: assertion 'G_TYPE_IS_BOXED (boxed_type)' failed

Последнее дает ошибку компиляции, которая ведет меня к типу компактного типа:

type check expressions not supported for compact classes, structs, and enums

Как я могу успешно скрыть GI.BaseInfo в GI.CallableInfo?

ответ

3

При назначении переменной Vala необходимо скопировать значение (в этом случае типы не засчитываются, поэтому копирование является единственным способом). Проблема здесь в том, что это копирование, а не кастинг. Присвоить его неизменной переменной:

unowned GI.CallableInfo myCallableInfo = (GI.CallableInfo) myBaseInfo; 
Смежные вопросы