如何使用GObjectIntrospection和vapigen告诉vala哪些getter和setter使用?

时间:2013-08-19 07:36:10

标签: binding getter-setter vala gobject-introspection

我编写了一个C库并使用vapigen为它创建了vapis。在 生成的文件有一些属性定义如下:

public int index { get; set; }

和访问器方法(我使用C语言,只返回值。) 属性)复制'get'和'set'功能:

public int get_index ();
public void request_index (int index);

我想要做的是告诉Vala在Vala代码时调用我的方法 使用表示法获取或设置属性:

i = object.index;
object.index = 42;

而不是像现在一样将其转换为g_object_get / g_object_set来电。

有没有办法做到这一点?

我已经在vala-devel和vala邮件列表中发布了这个,但没有人回答。

编辑:我正在使用gobject-introspection和vapigen与autotools自动生成vapi文件而不用担心API更改,因此重新定义Vala中的类来执行此操作对我来说不是一个选项,但我可以使用gobject-introspection annotationsmetadata个文件。

使用解决方案进行编辑:所选答案中的注释包含我的问题的解决方案,但基本上我所做的是使用自定义Vala文件并使用元数据文件跳过used属性。 / p>

元数据文件中的相关内容:

MyObject.index skip

在自定义Vala文件中:

namespace MyNamespace
{
    public class MyObject : GLib.Object
    {
        public int index
        {
            owned get;
            [CCode (cname = "db_model_request_index")]
            set;
        }
    }
}

2 个答案:

答案 0 :(得分:3)

你尝试过这样的事吗?

public int index {
        get { return get_index(); }
        set { set_index(value); }
    }

the official Vala Tutorial中有关于Vala属性的更多信息。

答案 1 :(得分:0)

(很抱歉,答案并非严格来说回答这个问题的人)

我认为您应该修复库,因为使用C api的人可能合法地做同样的事情(使用g_object_set()而不是属性特定的setter函数):if your_object_set_property和{{1函数调用特定的setter和getter函数,那么这个问题根本不存在,对吧?

如果你真的想修改vapi,那么正确的方法可能是使用gobject-introspection和它的注释,虽然我不确定确切的语法(并且有一些设置涉及如果你还没有使用gobject-introspection。)