如何将GLib.Array封装到GLib.Value中?
解决GLib.Array封装到GLib.Value的问题
哦,这个问题我之前踩过坑!你遇到的错误根源很明确:GLib.Array并不是GObject的子类,但你却用了只适用于GObject实例的value.set_object()方法,这就导致了类型不匹配的断言错误。
先拆解下你看到的错误:
invalid uninstantiatable type '(null)' in cast to 'GObject':你强行把Array<string>转成Object,但它根本不是GObject类型,所以GLib无法识别这个类型,只能返回null。g_value_set_object: assertion 'G_VALUE_HOLDS_OBJECT (value)' failed:你初始化的Value类型是Array,但set_object()要求Value必须持有GObject类型,两者不匹配,断言直接失败。
正确的解决方案:用Boxed类型处理
GLib专门为非GObject但需要在GValue中传递的类型提供了boxed类型机制,GLib.Array就属于这类。你需要用value.set_boxed()来替代set_object(),具体修正后的代码如下:
public int main (string[] args) { // 最好指定Array的元素类型,更严谨 var value = Value(typeof (Array<string>)); var a = new Array<string>(); a.append_val("test"); // 使用set_boxed而非set_object value.set_boxed(a); // 额外演示如何从Value中取出Array var retrieved_array = value.get_boxed() as Array<string>; if (retrieved_array != null) { print(@"取出的元素:$(retrieved_array.index(0))\n"); } return 0; }
关键说明:
- 初始化
Value时,指定具体的Array<string>类型比Array更安全,避免类型模糊。 set_boxed()和get_boxed()是专门用来处理boxed类型的方法,GLib.Array、GLib.List这类非GObject容器都适用。- 取出时记得用
as做类型转换,确保类型安全。
内容的提问来源于stack exchange,提问作者Ava
相关产品推荐
相关产品推荐

