【问题标题】:How can i invoke Vala methods dynamically?如何动态调用 Vala 方法?
【发布时间】:2012-09-16 11:51:14
【问题描述】:

我需要生成函数名然后调用它。 是否可以像在 php 中那样做 <?php call_user_func_array(array($object, $method));?>?

【问题讨论】:

    标签: invoke vala


    【解决方案1】:

    有四个选项:

    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 可以同样的方式使用。

    【讨论】:

    • 我认为第一个选项最适合我。非常感谢您的帮助!
    猜你喜欢
    • 2016-01-20
    • 2013-07-17
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多