2012-07-03 28 views
10

これはこれは私の質問です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 %} 
} 

私のデータモデルからC#コードを生成する、ための内部クラスを生成するために、私の神社テンプレートで、私はクラスの[「を渡すことができますどのように私のデータモデル、上の再帰的にループしたいですinnerClass "]を最初のfor文のパラメータとして使用しますか?

+2

を再帰的にツリー状の構造をレンダリングするあなたもJinja2ののループ再帰的な偉業を使用することができますure、[例](http://stackoverflow.com/a/10961991/4279) – jfs

+0

@ J.F.Sebastian:それは私の解決策よりもきれいです。あなたはあなたのコメントを答えにする必要があります。 – Helgi

+0

@Helgi Yoursははるかに簡単です。 Jinjaの再帰的なループ構文は、通常の再帰よりも混乱します。 –

答えて

12

あなたは、macrosを使用するクラスのレンダリングのためのマクロを作成し、その後、再帰的に呼び出すことができます。

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

これはうまく動作しますが、降伏、サブクラスの適切なインデントを扱いませんこのようなコード:

class Bar 
{ 
    int meow; 
    int bark; 

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

あなたの明確で有用な回答をありがとう – Pooya

関連する問題