2010-04-17 8 views
11

Soy un principiante T4 que intenta usar T4 Toolbox para generar código F # basado en this answer, pero parece que los bloques de función de clase no se pueden mezclar con bloques de instrucción. Aquí está mi código:Caja de herramientas T4: mezcla de función de clase y bloques de instrucción

<#@ template language="C#" hostspecific="True" debug="True" #> 
<#@ output extension="txt" #> 
<#@ include file="T4Toolbox.tt" #> 
<# 
    FSharpTemplate template = new FSharpTemplate(); 
    template.Output.Project = @"..\Library1\Library1.fsproj"; 
    template.Output.File = "Module2.fs"; 
    template.Render(); 
#> 
<#+ 
class FSharpTemplate: Template 
{ 
    public override string TransformText() 
    { 
#> 

module Module2 

<# for (int i = 0; i < 10; i++) { #> 
<#= i #> 
<# } #> 

<#+ 
     return this.GenerationEnvironment.ToString(); 
    } 
} 

#> 

Y consigo este error:

A Statement cannot appear after the first class feature in the template. Only boilerplate, expressions and other class features are allowed after the first class feature block.

Así que ... ¿cómo puedo volver a escribir la plantilla para lograr esto?

Respuesta

11

Después del bloque de características de primera clase, debe hacer que todos los bloques de instrucciones subsiguientes también bloqueen la clase.

Debajo de las carátulas, el bloque de características de primera clase termina el método "Generar" detrás de escena y cambia a insertar el contenido como miembros de la clase detrás de la clase de la plantilla.

Si está usando Visual Studio 2010, siempre puede crear una plantilla preprocesada y pegar su código de plantilla normal en eso para ver lo que sucede bajo el capó.

5

Debería tener todas las características de clase en el mismo bloque de características, debajo de cualquier salida.

+0

Si hago que consigo ninguna salida en absoluto –

+0

veo. Realmente no entiendo cómo la respuesta en la otra pregunta fue diseñada para funcionar, pero puedo decirte que esta es una regla para T4. Yo recomendaría agregar un enlace al archivo generado en el otro proyecto. – erikkallen

0

Mientras que la respuesta de @ GarethJ explica por qué sucede esto, no te dice la cura. Es necesario añadir un signo más, es decir, usar "< # +" en lugar de simplemente "< #"

<#+ for (int i = 0; i < 10; i++) { #> 
<#= i #> 
<#+ } #> 
Cuestiones relacionadas