Haxe宏调用类的静态方法

Fed*_*dor 4 macros haxe

我有一组类,它们都有相同的静态方法(或实际上是一组方法)。我将如何实现一个宏,该宏将允许我调用给定类的某些方法?像这样的东西getStaticMethod(className, methodName)(...args...)。我需要这样做,因为不幸的Class<T>是不提供对静态类成员的访问。

Gam*_*a11 5

这可以很简单地完成,您甚至不需要任何“字符串类型的代码”(将类和方法名传递给宏)。

您可以将点路径表达式传递给宏:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是-似乎在那时,您可以直接调用该函数吗?

如果您在调用宏时不知道类是什么,则宏可能对您没有多大帮助,也不允许您在编译时生成严格类型的代码。

将某些Class<T>实例传递到可能来自任何地方的宏与将具体的点路径/类名作为字符串文字传递之间是有区别的。如果在编译时不知道该调用的类,那么宏可以做的就是为您生成反射代码,因为这必须在运行时确定