2012-07-03 36 views
10

Đây là mẫu jinja của tôi để tạo ra C# mã từ mô hình dữ liệu của tôiLàm thế nào để đệ quy gọi macro trong 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 %} 
} 

đây là câu hỏi của tôi, vì tạo ra các lớp bên trong, tôi muốn đệ quy loop trên mô hình dữ liệu của tôi, thế nào tôi có thể vượt qua lớp [" innerClass "] làm tham số cho câu lệnh đầu tiên của tôi?

+2

để vẽ lại một cấu trúc cây giống như đệ quy bạn cũng có thể sử dụng vòng lặp kỳ đệ quy jinja2 của ure, [example] (http://stackoverflow.com/a/10961991/4279) – jfs

+0

@ J.F.Sebastian: Nó sạch hơn giải pháp của tôi. Bạn nên làm cho bình luận của bạn một câu trả lời. – Helgi

+0

@Helgi Yours là đơn giản hơn nhiều tuy nhiên. Cú pháp vòng lặp đệ qui của Jinja khó hiểu hơn là đệ quy bình thường. –

Trả lời

12

Bạn có thể sử dụng macros, hãy viết một macro cho các lớp học vẽ, và sau đó gọi nó một cách đệ quy:

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

này hoạt động tốt, nhưng không đối phó với sự thụt vào đúng lớp con, năng suất mã như thế này:

class Bar 
{ 
    int meow; 
    int bark; 

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

Cảm ơn rất nhiều vì câu trả lời rõ ràng và hữu ích của bạn – Pooya

Các vấn đề liên quan