有没有办法获取所有子类的名称
Is there a way of getting the names of all subclasses
我想获取一个基 class 的所有子 class 的名称。由此我想 @:build 一个枚举,其中每个条目都是 class 的名称。这可能吗?
您正在寻找自动构建宏功能https://haxe.org/manual/macro-auto-build.html
然后枚举建筑 https://haxe.org/manual/macro-enum-building.html
这是代码。宏执行的顺序未定义,如文档中指定的那样。
[AutoBuildingMacro.hx]
import haxe.macro.Context;
import haxe.macro.Expr;
final mapofnames = new Map<String,Array<String>>();
class AutoBuildingMacro {
public static macro function fromBaseClass(base):Array<Field> {
var parent = haxe.macro.ExprTools.toString(base);
var names = mapofnames[parent];
if ( names == null ) {
names = new Array<String>();
mapofnames[parent] = names;
}
names.push(Context.getLocalClass().toString());
trace(mapofnames);
return null;
}
}
[Main.hx]
import AutoBuildingMacro;
class Main {
static public function main() {}
}
@:autoBuild(AutoBuildingMacro.fromBaseClass(Parent))
class Parent {
}
class Child1 extends Parent {
}
class Child2 extends Parent {
}
class Child3 extends Child2 {
}
输出:
AutoBuildingMacro.hx:15: {父 => [子 2]}
AutoBuildingMacro.hx:15: {父 => [Child2,Child3]}
AutoBuildingMacro.hx:15: {父 => [Child2,Child3,Child1]}
我编写了一个名为 compiletime 的库,它具有以下功能:
// Returns a list of all the classes that inherit MySuperClass, no matter what package
CompileTime.getAllClasses(MySuperClass);
我采用的 approach 通过使用 Context.onGenerate 挂钩在编译结束时构建匹配 classes 的数组(而不是每个class被编译)并将数组添加到“metadata”中,仍然可以在“onGenerate”步骤中修改。然后我在单独的运行时 class 中使用此元数据在运行时获取 classes 的数组。
我想获取一个基 class 的所有子 class 的名称。由此我想 @:build 一个枚举,其中每个条目都是 class 的名称。这可能吗?
您正在寻找自动构建宏功能https://haxe.org/manual/macro-auto-build.html 然后枚举建筑 https://haxe.org/manual/macro-enum-building.html
这是代码。宏执行的顺序未定义,如文档中指定的那样。
[AutoBuildingMacro.hx]
import haxe.macro.Context;
import haxe.macro.Expr;
final mapofnames = new Map<String,Array<String>>();
class AutoBuildingMacro {
public static macro function fromBaseClass(base):Array<Field> {
var parent = haxe.macro.ExprTools.toString(base);
var names = mapofnames[parent];
if ( names == null ) {
names = new Array<String>();
mapofnames[parent] = names;
}
names.push(Context.getLocalClass().toString());
trace(mapofnames);
return null;
}
}
[Main.hx]
import AutoBuildingMacro;
class Main {
static public function main() {}
}
@:autoBuild(AutoBuildingMacro.fromBaseClass(Parent))
class Parent {
}
class Child1 extends Parent {
}
class Child2 extends Parent {
}
class Child3 extends Child2 {
}
输出:
AutoBuildingMacro.hx:15: {父 => [子 2]}
AutoBuildingMacro.hx:15: {父 => [Child2,Child3]}
AutoBuildingMacro.hx:15: {父 => [Child2,Child3,Child1]}
我编写了一个名为 compiletime 的库,它具有以下功能:
// Returns a list of all the classes that inherit MySuperClass, no matter what package
CompileTime.getAllClasses(MySuperClass);
我采用的 approach 通过使用 Context.onGenerate 挂钩在编译结束时构建匹配 classes 的数组(而不是每个class被编译)并将数组添加到“metadata”中,仍然可以在“onGenerate”步骤中修改。然后我在单独的运行时 class 中使用此元数据在运行时获取 classes 的数组。