3

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

public int index { get; set; }

访问器方法(我从 C 中使用并且只返回属性的值)复制了这个“获取”和“设置”功能:

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 注释元数据文件。

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

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

MyObject.index skip

在自定义 Vala 文件中:

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

2 回答 2

3

你有没有尝试过这样的事情?

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

在官方 Vala 教程中有更多关于 Vala 属性的信息。

于 2013-08-19T19:39:03.607 回答
0

(很抱歉,他的答案并没有严格地回答问题)

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

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

于 2013-08-19T09:02:58.907 回答