获取类构造函数接受的参数数量

时间:2016-07-18 00:26:04

标签: haxe

给出Foo类

class Foo
{
    public function new(foo:Int, bar:Int, foobar:Int) {}
}

检索new接受的参数数量。我尝试过使用@:rtti - 然后我尝试了

for(field in haxe.rtti.Rtti.getRtti(Foo).fields) {
    if (field.name == "new") {
         trace(field.type);
    }
}

结果很有希望

**

TestAll.hx:246: CFunction({
        length : 3,
        h : {
            item : {
                name : foo, 
                opt : false, 
                t : CAbstract(<...>,<...>), 
                value : null
            }, 
            next : {
                item : {
                    name : <...>, 
                    opt : <...>, 
                    t : <...>, 
                    value : null
                }, 
                next : {
                    item : <...>, 
                    next : null
                }
            }
        }, 
        q : {
            item : {
                name : foobar, 
                opt : false, 
                t : CAbstract(<...>,<...>), 
                value : null
            }, 
            next : null
        }
    },CAbstract(Void,{
            length : 0
        }))**

所以我尝试了field.type.length

  

test / TestAll.hx:246:字符14-31:haxe.rtti.CType没有字段   长度

快速浏览http://api.haxe.org/haxe/rtti/CType.html#CFunction后, 我可以看到

CFunction(args:List<FunctionArgument>, ret:CType)

???我很困惑 - 它包含一个List,但它只返回CType?如何获得我想要的信息?

谢谢。

PS。我不想要宏解决方案,这是在单元测试中使用的,并且构造本身的生成已经非常重。

1 个答案:

答案 0 :(得分:1)

CType是枚举,而CFunction是可能的枚举值之一(或“枚举构造函数”)。

您可以在此处查看源代码:https://github.com/HaxeFoundation/haxe/blob/development/std/haxe/rtti/CType.hx#L42-L51

您需要使用switch语句深入了解并获取列表:

switch (field.type) {
    case CFunction(args,returnType):
        trace(args.length);
    default:
        // Do nothing
}

要了解更多信息,我建议您阅读以下手册: