我如何动态调用Vala方法?

时间:2012-09-14 07:57:39

标签: invoke vala

我需要生成函数名称,然后调用它。 有可能在PHP中做 <?php call_user_func_array(array($object, $method));?>

1 个答案:

答案 0 :(得分:2)

有四种选择:

  1. 将您想要调用的方法设置为此信号。信号可以通过名称GLib.Signal.emit_by_name (g_signal_emit_by_name)发出。该调用来自GLib模式,但其他具有信号支持的模式可能具有类似的方法。

  2. 在代码中手动创建委托对象的静态表/哈希表。主要优点是它是类型安全的。缺点是你必须在两个地方添加每个方法。它也适用于所有vala模式。

  3. 另一种选择是告诉vala编译器构建“gir”绑定并使用GObject Introspection库来调用这些函数。这要复杂得多,但编译器会为您维护可用方法列表。此方法特定于GLib模式。

  4. 最后一个选项是使用GLib的GLib.Module.symbol (g_module_symbol)功能来查找符号。您需要知道符号的“受损”C名称,它不是类型安全的。您必须准确匹配参数类型并注意调用者应该去的位置。它避免了GIR的开销,但与GIR不同,它不能告诉你哪些方法存在,只能得到一个特定的方法。在GtkBuilder中连接信号时使用此方法。我在GLib中提到了函数,但POSIX.dlsym可以使用相同的方式。