2012-04-29 12 views
5

Cuando intento acceder al objeto Host desde un método no estático declarado en < # + #> corchetes, todo funciona bien. Pero necesito acceder a él desde un método de clase, así:Acceso al objeto Host desde la clase T4

<#+ 
public class ProjectTraverser 
{ 
    public void Traverse() 
    { 
     var a = Host; 
    } 
} 
#> 

me sale el siguiente error cuando se ejecuta esta plantilla: "transformación Compilación: No se puede acceder a un miembro no estática de tipo exterior 'Microsoft.VisualStudio .TextTemplating7D03DF372FEAC3D3A28C011A41F02403.GeneratedTextTransformation' a través de tipo anidado 'Microsoft.VisualStudio.TextTemplating7D03DF372FEAC3D3A28C011A41F02403.GeneratedTextTransformation.ProjectTraverser' d: \ Proyectos \ Test Solutions \ gettingstarted \ TelerikMvc3RazorApplication \ TextTemplate2.tt"

favor comparta cualquier idea.

+1

Es exactamente como se dice (no se puede acceder miembro no estática de tipo exterior), pero se podía pasar anfitrión en un constructor de ProjectTraverser. – FuleSnabel

+0

Gracias por tu comentario FuleSnabel. No es el mejor nivel de encapsulación, pero sin embargo es una solución. – Narek

Respuesta

4

Como comentó FuleSnabel, la declaración que está haciendo es para un tipo anidado, que no tiene acceso a la variable de instancia en el tipo adjunto que representa la plantilla.

Lo que debe hacer es agregar una propiedad de host de tipo ITextTemplatingEngineHost a la clase ProjectTraverser (probablemente estática) y luego configurarla desde la plantilla principal.

En retrospectiva, desearía haber hecho que la propiedad principal del Host sea estática, ya que no es realmente sensato imaginar varios hosts para diferentes instancias de la misma plantilla en el mismo Dominio de Aplicación, pero usted vive y aprende.

Aquí está un ejemplo aproximado:

<#@ template hostspecific="true' #> 
<# 
    ProjectTraverser.Host = Host; 
#> 
<#+ 
public class ProjectTraverser 
{ 
    public static ITextTemplatingEngineHost Host { get; set; } 

    public void Traverse() 
    { 
     var a = Host; 
    } 
} 
#> 
+0

Gracias por su respuesta, Gareth, ¿podría elaborar en la parte "y luego configurar desde la plantilla principal". Por lo que yo entiendo, debo tener un método de inicialización separado para mi clase, que debe ser llamado antes de usar la clase, lo cual es bastante inconveniente. ¿Estoy en lo cierto, o esto podría lograrse de una mejor manera? – Narek

+0

Editado para incluir un pequeño ejemplo. – GarethJ

Cuestiones relacionadas