我编写了一个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 annotations和metadata个文件。
使用解决方案进行编辑:所选答案中的注释包含我的问题的解决方案,但基本上我所做的是使用自定义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;
}
}
}
答案 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。)