2016-07-18 29 views
0

Gegeben Klasse FooErste Anzahl der Argumente von Klassenkonstruktor akzeptiert

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

Anzahl von new akzeptierte Argumente abrufen. Ich habe versucht @:rtti mit - dann habe ich versucht

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

Das Ergebnis vielversprechend war

**

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 
     }))** 

Also habe ich versucht field.type.length.

Test/TestAll.hx: 246: Zeichen 14-31: haxe.rtti.CType hat kein Feld Länge

Nach einem kurzen Blick auf http://api.haxe.org/haxe/rtti/CType.html#CFunction, ich

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

??? Ich bin verwirrt - es enthält eine Liste, aber es gibt nur CType zurück? Wie komme ich zu den gewünschten Informationen?

Vielen Dank.

PS. Ich möchte keine Makrolösung, das wird im Komponententest verwendet, und die Generierung der Konstruktion selbst ist bereits makro-schwer.

Antwort

1

CType ist eine Enumeration, und CFunction ist einer der möglichen Enum-Werte (oder "enum constructors").

Sie den Quellcode hier sehen können: https://github.com/HaxeFoundation/haxe/blob/development/std/haxe/rtti/CType.hx#L42-L51

Sie erhalten eine switch Aussage hinein tauchen und erhalten Sie Ihre Liste verwenden müssen:

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

Um mehr zu erfahren ich diese Handbuchseiten empfehlen :