Macros 将自定义编译元数据用于别名@:生成

Macros 将自定义编译元数据用于别名@:生成,macros,haxe,Macros,Haxe,我有一个宏类(HashCodeBuilder),它将散列函数注入另一个类。对于injectee类,我需要添加@:build(base.HashCodeBuilder.build()) 但是我想使用一个自定义元数据别名@:build元数据并将参数传递给我的宏,因此 @:build(base.HashCodeBuilder.build()) 我想用 @:hashcodebuilder({composeFields:[product.id, vendor.id]}) 这可以通过使用带有@:bui

我有一个宏类(
HashCodeBuilder
),它将散列函数注入另一个类。对于injectee类,我需要添加
@:build(base.HashCodeBuilder.build())

但是我想使用一个自定义元数据别名
@:build
元数据并将参数传递给我的宏,因此

@:build(base.HashCodeBuilder.build())
我想用

@:hashcodebuilder({composeFields:[product.id, vendor.id]}) 
这可以通过使用带有
@:build
宏的接口,然后将我的自定义编译器元数据添加到注入对象中来实现。然而,这意味着扩展一些
Impl
,但是我的注入者可能已经有了一个超类。这就是为什么我不能使用默认策略

那么最好的方法是什么呢?没有太多关于宏的文档

// TestClass.hx
@:build(base.HashCodeBuilder.build())
class TestClass extends AlreadySomeSuperClass{
    public function new() {

    }
}

//HashCodeBuilder.hx
class HashCodeBuilder{
    public static function build():Array<Field>{
        var fields = Context.getBuildFields();
        var value = NumberTheory.getRandomPrime();
        var pos = Context.currentPos();
        var hashCodeFunc:Function={
            expr: macro return $v{value},
            ret:(macro:UInt),
            args:[],
        };
        var hashCode:Field ={
            name: 'hashCode',
            access: [Access.APublic],
            kind: FieldType.FFun(hashCodeFunc),
            pos:pos,
        };
        fields.push(hashCode);

        return fields;
    }
}
//TestClass.hx
@:build(base.HashCodeBuilder.build())
类TestClass扩展了AlreadySome超类{
公共职能(新增){
}
}
//HashCodeBuilder.hx
类HashCodeBuilder{
公共静态函数build():数组{
var fields=Context.getBuildFields();
var value=NumberTheory.getRandomPrime();
var pos=Context.currentPos();
var hashCodeFunc:函数={
expr:宏返回$v{value},
ret:(宏:UInt),
args:[],
};
var哈希代码:字段={
名称:“hashCode”,
access:[access.APublic],
种类:FieldType.FFun(hashCodeFunc),
pos:pos,
};
fields.push(hashCode);
返回字段;
}
}