3

场景: 我有 x 个课程。让我们说10;每个类执行不同的 UI 功能。当用户加载文件时,该扩展名告诉程序要加载的类名;但它是字符串的形式。

反正有没有将字符串作为类名传递?大意的东西。

 var classname = "Booger";

 var nose = new classname(){ //classname really means "Booger"
 //Do Operation
 }
4

2 回答 2

4

您可以使用 来按名称反映类型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().

于 2013-01-08T14:25:59.300 回答
1

在获得针对 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;
}
于 2013-05-12T08:08:48.847 回答