Я использую библиотеку 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?