场景: 我有 x 个课程。让我们说10;每个类执行不同的 UI 功能。当用户加载文件时,该扩展名告诉程序要加载的类名;但它是字符串的形式。
反正有没有将字符串作为类名传递?大意的东西。
var classname = "Booger";
var nose = new classname(){ //classname really means "Booger"
//Do Operation
}
您可以使用 来按名称反映类型var t = Type.from_name(classname);
,但是,这适用于所有类型,包括枚举和结构,它可能是 type Type.INVALID
。您可能应该做一些检查,例如t.is_a(typeof(MyParentClass))
.
然后,您可以使用var obj = Object.new(t);
. 整个事情看起来像:
var classname = "Booger";
var t = Type.from_name(classname);
if (t.is_a(typeof(MyParentClass)))
return Object.new(t);
else
return null;
还值得注意的是,运行时类型名称前面有命名空间,因此您可能想要这样做"MyNs" + classname
。您可以签入生成的 C 或正在执行的typeof(MyClass).name()
.
在获得针对 null 的断言错误方面,我遇到了与 OP 相同的问题。如果您查看 Glib 文档(在 C 中),它提到您必须先通过实际指定类名来注册您的类,然后才能实际使用类名的字符串表示。
换句话说,您必须先使用您的类,然后才能使用 Glib.Type.from_name ("ClassName") 实例化您的类的副本。
您可以通过实例化类实例或获取类的类型信息来首先使用您的类。
var type = typeof (MyClass);
var type_from_string = Type.from_name ("MyClass");
此外,当您使用 Object.new 创建一个类时,您需要注意两件事:
1)您需要转换返回值以获取您的特定类或基类。
var instance_of_my_class = Object.new (type) as MyClass;
2)你的类的构造函数将不再被调用(我不知道为什么)。你需要在你的类中使用 GObject 风格的构造函数:
construct {
pizza = 5;
}