2012-07-03 7 views
10

To mój szablon jinja do generowania kodu C# od mojego modelu danychJak rekursywnie wywoływać makro w jinja2?

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 %} 
} 

to jest moje pytanie do generowania klas wewnętrznych, chcę rekursywnie pętla na moim modelu danych, jak mogę przejść klasy [” innerClass "] jako parametr do mojej pierwszej instrukcji?

+2

aby uczynić strukturę drzewiastą rekurencyjnie można też użyć jinja2 w pętli rekurencyjnej wyczyn ure, [przykład] (http://stackoverflow.com/a/10961991/4279) – jfs

+0

@ J.F.Sebastian: To czystsze niż moje rozwiązanie. Powinieneś zrobić komentarz jako odpowiedź. – Helgi

+0

@Helgi Yours jest jednak znacznie prostszy. Składnia pętli rekurencyjnej Jinji jest bardziej zagmatwana niż zwykła rekursja. –

Odpowiedz

12

Można użyć macros, napisać makro dla klasy renderingu, a następnie nazwać rekurencyjnie:

{% 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 %} 

Działa to dobrze, ale nie dotyczy prawidłowego wcięcia podklasy, otrzymując Kod tak:

class Bar 
{ 
    int meow; 
    int bark; 

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

Dziękuję bardzo za jasną i przydatną odpowiedź – Pooya