2012-07-03 12 views
10

Das ist mein jinja Vorlage C# -Code aus meinem DatenmodellWie rekursiv einen Makro in Jinja2 aufrufen?

using System; 

namespace {{ domain["ns"] }} { 
{% for class in domain["content"] %} 
    public class {{ class["name"] }} { 

    #region Inners 
     {{ class["innerClass"] }} 
    #endregion 

    #region Props 
    {% for field in class["content"] %} 
     {% if field["readonly"] == "true" %} 
      {% set readonly="private" %} 
     {% else %} 
      {% set readonly="" %} 
     {% endif %} 
     public {{ field["type"] }} {{ field["name"] }} {get; 
       {{ readonly }} set{ 

        if ({{ field["constraint"] }}){ 
         {{ field["name"] }}=value; 
        }else { 
         throw new Exception("Inserted value for {{ field["name"] }} is not valid!"); 
        } 
       } 
     } 
    {% endfor %} 
    #endregion 
    } 
{% endfor %} 
} 

das ist meine Frage, für erzeugen innere Klassen, ich mag rekursiv Schleife auf meinem Datenmodell zu erzeugen, wie ich die Klasse [passieren kann“ innerClass "] als Parameter zu meiner ersten Aussage?

+2

eine baumartige Struktur machen rekursiv könnten Sie auch jinja2-Schleife rekursive Leistung verwenden ure, [beispiel] (http://stackoverflow.com/a/10961991/4279) – jfs

+0

@ J.F.Sebastian: Das ist sauberer als meine Lösung. Sie sollten Ihren Kommentar eine Antwort geben. – Helgi

+0

@Helgi Yours ist viel einfacher jedoch. Die rekursive Schleifensyntax von Jinja ist verwirrender als die normale Rekursion. –

Antwort

12

Sie können macros verwenden, ein Makro für Klasse-Rendering schreiben, und dann rekursiv rufen:

{% macro render_class(class) -%} 
class {{ class.name }} 
{ 
{% for field in class.fields %} 
    int {{ field }}; 
{% endfor %} 
{% for subclass in class.subclasses %} 
{{ render_class(subclass) }} 
{% endfor %} 
} 
{%- endmacro %} 

{% for class in classes %} 
{{ render_class(class) }} 
{% endfor %} 

Das funktioniert gut, aber nicht mit der richtigen Vertiefung von Subklassen beschäftigen, wodurch man Code wie folgt:

class Bar 
{ 
    int meow; 
    int bark; 

class SubBar 
{ 
    int joe; 
    int pete; 
} 
} 
+1

10 Vielen Dank für Ihre klare und nützliche Antwort – Pooya

Verwandte Themen