2017-07-10 3 views

Antwort

3

Sie können Context.typeof() verwenden, um den Typ des Ausdrucks zu erhalten - dann müssen Sie ein wenig Mustererkennung durchführen, um den Namen des Typs herauszufinden. Die folgend funktioniert nur mit Klassen, weil es nur TInst paßt, könnte aber verlängert werden:

import haxe.macro.Context; 
import haxe.macro.Expr; 

class Container { 
    // [...] 

    public macro function add(self:Expr, object:Expr):Expr { 
     var name = switch (Context.typeof(object)) { 
      case TInst(_.get() => t, _): t.name; 
      case _: throw "object type not found"; 
     } 
     return macro $self.addChild($i{name}.id_, $object); 
    } 
} 

Dies generiert den folgenden Code:

var c = new Container(); 
c.addChild(Child1.id_, new Child1()); 
c.addChild(Child2.id_, new Child2()); 

Beachten Sie, dass _id über sie Zugriff ist nicht qualifizierter Name ist nur sicher, wenn Es ist tatsächlich importiert (oder Toplevel) - in der Praxis würden Sie t.pack in Kombination mit $p{} verwenden, um den vollständig qualifizierten Pfad zu generieren.

+0

Vielen Dank - das funktioniert wie gewünscht! – montonero

Verwandte Themen