用于调用 class 静态方法的 Haxe 宏
Haxe macro to call static method of a class
我有一组 classes,它们都有相同的静态方法(或者实际上是一组方法)。我将如何实现一个允许我调用给定 class 的特定方法的宏?像这样 getStaticMethod(className, methodName)(...args...)
。我需要这个,因为不幸的是 Class<T>
不提供对静态 class 成员的访问。
这可以非常简单地完成,您甚至不需要任何 "stringly typed code"(将 class 和方法名称传递给宏)。
您可以将点路径表达式传递给宏:
import haxe.macro.Expr;
class Main {
static function main() {
trace(resolveDotPath(haxe.Json.parse)("{}")); // {}
trace(resolveDotPath(Math.random)()); // 0.34622209081586863
}
static macro function resolveDotPath(dotPath:Expr):Expr {
return macro $dotPath;
}
}
但是 - 似乎到那时,您可以直接调用该函数吗?
如果您在调用宏时不知道 class 是什么,宏可能对您帮助不大,并且不允许您在编译时生成严格类型的代码。
将某些 Class<T>
实例传递给可能来自任何地方的宏与传递具体的点路径/class 名称作为字符串文字之间存在差异。如果有关调用的 class 在编译时未知,则宏所能做的就是为您生成反射代码,因为这必须在 运行时 .
我有一组 classes,它们都有相同的静态方法(或者实际上是一组方法)。我将如何实现一个允许我调用给定 class 的特定方法的宏?像这样 getStaticMethod(className, methodName)(...args...)
。我需要这个,因为不幸的是 Class<T>
不提供对静态 class 成员的访问。
这可以非常简单地完成,您甚至不需要任何 "stringly typed code"(将 class 和方法名称传递给宏)。
您可以将点路径表达式传递给宏:
import haxe.macro.Expr;
class Main {
static function main() {
trace(resolveDotPath(haxe.Json.parse)("{}")); // {}
trace(resolveDotPath(Math.random)()); // 0.34622209081586863
}
static macro function resolveDotPath(dotPath:Expr):Expr {
return macro $dotPath;
}
}
但是 - 似乎到那时,您可以直接调用该函数吗?
如果您在调用宏时不知道 class 是什么,宏可能对您帮助不大,并且不允许您在编译时生成严格类型的代码。
将某些 Class<T>
实例传递给可能来自任何地方的宏与传递具体的点路径/class 名称作为字符串文字之间存在差异。如果有关调用的 class 在编译时未知,则宏所能做的就是为您生成反射代码,因为这必须在 运行时 .