2012-07-03 40 views
10

Bu, bu benim sorudurJinja2'de bir makroyu nasıl çağırabilirim?

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

benim veri modeli C# kodunu oluşturmak için iç sınıflar oluşturmak için benim jinja şablon, ben sınıf [" geçebilir nasıl veri modeline yinelemeli döngü istiyorum ilk ifadem için parametre olarak innerClass "]?

+2

yinelemeli bir ağaç gibi yapı işlemek için ayrıca jinja2 en döngü özyinelemeli ustalığı kullanabilirsiniz ure, [örnek] (http://stackoverflow.com/a/10961991/4279) – jfs

+0

@ J.F.Sebastian: Bu benim çözümümden daha temiz. Yorumunuzu bir cevap vermelisiniz. – Helgi

+0

@Helgi Sizinki çok daha basittir. Jinja'nın yinelemeli döngü sözdizimi, normal tekrardan daha kafa karıştırıcıdır. –

cevap

12

Sen macros kullanmak sınıf oluşturma için bir makro yazmak ve sonra yinelemeli diyebilirsiniz:

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

Bu iyi çalışıyor, ama verimli, alt sınıflara düzgün girinti ile uğraşmaz böyle kodu:

class Bar 
{ 
    int meow; 
    int bark; 

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

Açık ve faydalı cevabınız için çok teşekkürler – Pooya

İlgili konular