Haxe макрос для вызова статического метода класса - PullRequest
3 голосов
/ 03 апреля 2019

У меня есть набор классов, каждый из которых имеет один и тот же статический метод (или фактически набор методов). Как бы я реализовал макрос, который позволил бы мне вызывать определенный метод данного класса? Примерно так getStaticMethod(className, methodName)(...args...). Мне это нужно, потому что, к сожалению, Class<T> не предоставляет доступ к статическим членам класса.

1 Ответ

4 голосов
/ 03 апреля 2019

Это можно сделать действительно тривиально, вам даже не нужен какой-либо "строково-типизированный код" (передача имени класса и метода в макрос).

Вы можете просто передать выражение точки-пути в макрос:

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<T> макросу, который может прийти откуда угодно, и передачей пути к конкретной точке / имени класса в виде строкового литерала. Если класс для рассматриваемого вызова неизвестен во время компиляции, все, что может сделать макрос, - это сгенерировать код отражения для вас, так как это должно быть решено в время выполнения .

...