Как использовать шаблоны внутри метода T4 ClassBlock? - PullRequest
1 голос
/ 15 октября 2008

Я начинаю исследовать T4 для генерации кода.

Я понял, что у вас есть базовый шаблон, в который вы можете вставлять маленькие кусочки c # / vb, которые могут выполнять умные вещи ...

<#@ template language="VB" debug="True" hostspecific="True" #>
<#@ output extension=".vb" debug="True" hostspecific="True" #>
Imports System
<#For Each Table as String in New String(0 {"Table1","Table2"}#>
Public Class <#=Table#>DA
    Public Sub New
        <#= WriteConstructorBody() #>
    End Sub 
End Class
<#Next#>
<#+
    Public Function WriteConstructorBody() as String
        return "' Some comment"
    End function
#>

Это здорово .. Однако я бы хотел написать свой основной блок таким образом ...

<#@ template language="VB" debug="True" hostspecific="True" #>
<#@ output extension=".vb" debug="True" hostspecific="True" #>
Imports System
<# 
For Each BaseTableName as String in New String(){"Table1","Table2"} 
    WriteRecDataInterface(BaseTableName) 
    WriteRecDataClass(BaseTableName) 
    WriteDAInterface(BaseTableName) 
    WriteDAClass(BaseTableName) 
Next 
#>

Тогда я бы хотел, чтобы методы WriteX существовали в блоке классов, но сами были доступны для записи, используя код в качестве примера, т.е. экранированные блоки кода.

Как мне этого добиться?

Ответы [ 2 ]

2 голосов
/ 15 октября 2008

Вы можете написать .....

<#@ template language="VB" debug="True" hostspecific="True" #>
<#@ output extension=".vb" debug="True" hostspecific="True" #>
Imports System
<# 
For Each BaseTableName as String in New String(){"Table1","Table2"} 
    WriteRecDataInterface(BaseTableName) 

    ' WriteRecDataClass(BaseTableName) 
    ' WriteDAInterface(BaseTableName) 
    ' WriteDAClass(BaseTableName) 
Next 
#>


<#+ Public Sub WriteRecDataInterface(BaseTableName as String)#>
    Some Templated unescaped code might go here
    <#+ For SomeLoopVar as Integer = 1 to 10 #>
        Some Templated unescaped code might go here
    <#+ Next #>
    Some Templated unescaped code might go here
<#+ End Sub #>
'...
'...
' Other Subs left out for brevity
'...
1 голос
/ 15 октября 2008

Кажется, что вы можете смешивать статический вывод с кодом шаблона в блоках классов. Вот пример с C #:

<#@ template language="C#" #>
<# HelloWorld(); #>
<#+
    private string _field = "classy";
    private void HelloWorld()
    {
        for(int i = 1; i <= 3; i++)
        {
#>
Hello <#=_field#> World <#= i #>!
<#+
        }
    }
#>
...