微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

有没有办法获取所有子类的名称

如何解决有没有办法获取所有子类的名称

我想获取基类的所有子类的名称。从那我想@:build 一个枚举,其中每个条目都是一个类的名称。这可能吗?

解决方法

您正在寻找自动构建宏功能 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: {Parent => [Child2]}

AutoBuildingMacro.hx:15: {Parent => [Child2,Child3]}

AutoBuildingMacro.hx:15: {Parent => [Child2,Child3,Child1]}

,

我编写了一个名为 compiletime 的库,它具有此功能:

// Returns a list of all the classes that inherit MySuperClass,no matter what package
CompileTime.getAllClasses(MySuperClass);

我采用的 approach 解决了构建顺序问题,方法是在编译结束时使用 Context.onGenerate 钩子构建匹配类的数组(而不是编译每个类时)并将该数组添加到“元数据”,仍然可以在“onGenerate”步骤中修改。然后,我在单独的运行时类中使用此元数据在运行时获取类数组。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。