我是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
答案 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