我喜欢以(平台无关的)方式列出包中的所有类。
一种可能的方法是获取Haxe已知的所有类的列表,然后通过它进行过滤。
答案 0 :(得分:5)
我做了一个宏来帮助解决这个问题。它位于compiletime haxelib。
haxelib install compiletime
然后将其添加到您的构建(hxml文件):
-lib compiletime
然后用它来导入你的类:
// All classes in this package, including sub packages.
var testcases = CompileTime.getAllClasses("my.package");
// All classes in this package, not including sub packages.
var testcases = CompileTime.getAllClasses("my.package",false);
// All classes that extend (or implement) TestCase
var testcases = CompileTime.getAllClasses(TestCase);
// All classes in a package that extend TestCase
var testcases = CompileTime.getAllClasses("my.package",TestCase);
然后你可以迭代它们:
for ( testClass in testcases ) {
var test = Type.createInstance( testClass, [] );
}
请注意,如果您的代码中没有“import some.package.SomeClass”,那么该类将永远不会包含在内,因为代码消失了。因此,如果您想确保它被包含在内,即使您从未在代码中明确地调用它,也可以执行以下操作:
CompileTime.importPackage( "mygame.levels" );
CompileTime.getAllClasses( "mygame.levels", GameLevel );
工作原理
CompileTime.getAllClasses
是一个宏,它的作用是:
@classLists(...)
文件中的一些特殊元数据 - CompileTimeClassList
元数据,其中包含所有匹配类的名称。Type.resolveClass(...)
一起创建所有匹配类型的列表。答案 1 :(得分:3)
这是存储和检索信息的一种方法:https://gist.github.com/back2dos/c9410ed3ed476ecc1007
除此之外,您可以使用haxe -xml
获取所需的类型信息,然后根据需要对其进行转换(使用haxe.rtti
中的解析器来处理数据)并使用{{嵌入JSON编码结果1}}(通过-resource theinfo.json
访问)。
作为旁注:有可能你最好没有任何自动化,只需手动将类添加到数组中。想象一下,你有haxe.Resource
,somepackage.ClassA
,...然后就可以了
somepackage.ClassB
它为您提供了更多的灵活性,无论您想做什么,您都可以随时添加第三方类,这些类可能不一定在同一个包中,您也可以选择不使用类而不必删除它。