Vala:在运行时确定List中的泛型类型

时间:2014-07-12 06:32:10

标签: generics reflection vala

我是Vala的新手并且玩了一下。目前我正在寻找一种在运行时确定通用列表的类型参数的方法。

下面的代码使用'reflection'来打印Locations类的属性。但是,我无法在运行时确定此列表包含字符串实例。

有办法做到这一点吗?或者Vala不支持这个?

using Gee;
class Locations : Object {
    public string numFound { get; set; }
    public ArrayList<string> docs { get; set; }
}

void main () {
    ObjectClass ocl = (ObjectClass) typeof (Locations).class_ref ();
    ParamSpec[] properties = ocl.list_properties ();
    foreach (ParamSpec spec in properties) {
        string fieldName = spec.get_nick ();
        stdout.printf (" fieldName: %s\n", fieldName);
        Type fieldType = spec.value_type;
        stdout.printf (" Type : %s\n", fieldType.name());
    }
}

输出:

fieldName: numFound
Type : gchararray
fieldName: docs
Type : GeeArrayList

2 个答案:

答案 0 :(得分:1)

没有通用的方法来做到这一点,因为GObject / GType根本就没有表现力。例如,如果您使用的是GLib.GenericArray(或GLib.List)而不是Gee.ArrayList,那么您将失去运气。

那说,libgee确实提供了一种方法。与libgee中的大多数容器一样,Gee.ArrayList实现Gee.Traversable,其中包含element_type属性。但请注意,您需要一个实例,而不仅仅是GLib.ObjectClass

答案 1 :(得分:0)

在第一个答案的建议的帮助下,我提出了这个解决方案。 这正是我想要的:

using Gee;
class Locations : Object {
    public int numFound { get; set; }
    public Gee.List<string> docs { get; set; }
    public Locations () {
        docs = new ArrayList<string>();
    }
}

void main () {
    ObjectClass ocl = (ObjectClass) typeof (Locations).class_ref ();
    ParamSpec[] properties = ocl.list_properties ();
    Locations locs = new Locations();
    foreach (ParamSpec spec in properties) {
        string fieldName = spec.get_nick ();
        Type fieldType = spec.value_type;

        // get the docs instance from the locations instance
        GLib.Value props = Value( fieldType);
        locs.get_property(fieldName, ref props);
        stdout.printf ("Field type %s : %s\n", fieldName, props.type_name());
        if(props.holds(typeof (Gee.Iterable))) {
            Gee.Iterable docs =  (Gee.Iterable)props.get_object();
            stdout.printf ("\tList parameter type : %s\n", docs.element_type.name());
        }
    }
}

输出:

Field type numFound : gint
Field type docs : GeeList
    List parameter type : gchararray