2015-06-04 68 views
1

我使用Vala的gobject-introspection-1.0库来动态加载吉尔模块。因为我需要调用具有固定名称的初始化函数,所以我从Repository.find_by_name中检索BaseInfo对象。如何在Vala中使用紧凑型?

现在,我想调用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;