2010-01-11 9 views
29

que tienen una plantilla T4 para una clase configurar con la herramienta personalizada TextTemplatingFileGenerator en Visual Studio:¿Cómo se genera el espacio de nombres en las plantillas T4?

<#@ template language="C#v3.5" hostspecific="True" debug="True" #> 
<# 
    var className = System.IO.Path.GetFileNameWithoutExtension(Host.TemplateFile); 
    var namespaceName = "MyNamespace"; 
#> 

namespace <#= namespaceName #> 
{ 
    public static class <#= className #> 
    { 
     // some generated code 
    } 
} 

¿Cómo puedo obtener el valor de la propiedad "Custom herramienta de espacio de nombres" en Visual Studio, así que no lo hacen tiene que codificar el espacio de nombres?

Incluso estaría contento con el espacio de nombres predeterminado para el proyecto C#.

Respuesta

47

Si está utilizando Visual Studio 2010, puede recuperar el espacio de nombres marcando la propiedad "NamespaceHint" de CallContext.

System.Runtime.Remoting.Messaging.CallContext.LogicalGetData("NamespaceHint"); 
+1

Desafortunadamente, este truco no funciona cuando se usa MSBuild sistema de transformación (como se ilustra aquí: http://www.olegsych.com/2010/04/understanding-t4-msbuild-integration/). Gorrón. :( –

+0

Esta función hace que la depuración falle –

13

Esto es lo que puede hacer con T4 Toolbox:

<#@ template language="C#v3.5" hostspecific="True" debug="True" #> 
<#@ include file="T4Toolbox.tt" #> 
<# 
    var namespaceName = TransformationContext.DefaultNamespace; 
#> 

propiedad defaultNamespace de clase TransformationContext devuelve una cadena con el espacio de nombres basado en el espacio de nombres raíz de su proyecto y la ubicación de su archivo .tt (es decir, trata las carpetas como espacios de nombres). De esta forma, no tiene que especificar la propiedad del Espacio de nombres de la Herramienta Personalizada para cada instancia de su archivo .tt.

Si prefiere para utilizar la propiedad Espacio de nombres de herramientas personalizadas, puede pasar Host.TemplateFile al método GetCustomToolNamespace publicado por @sixlettervariables.

+0

me sale el error: 'T4Toolbox.TransformationContext' no contiene una definición para 'defaultNamespace' –

+1

Encontrado una solución en este post suyo: http://www.olegsych.com/2012/12/t4-toolbox-for-visual-studio-2012/ –

2

Si utiliza Visual Studio 2012

EdmItemCollection ItemCollection = loader.CreateEdmItemCollection(inputFile); 
string namespaceName = System.Runtime.Remoting.Messaging.CallContext.LogicalGetData("NamespaceHint").ToString(); 

EntityFrameworkTemplateFileManager fileManager = EntityFrameworkTemplateFileManager.Create(this); 

Aldo Flores @alduar

0

La respuesta aceptada no funciona en Proyectos de Visual Basic. Tuve que usar el método de: http://lennybacon.com/post/2010/12/10/generatingcodefileswithcorrectnamespacesusingt4

var hostServiceProvider = (IServiceProvider)Host; 
var dte = (EnvDTE.DTE)hostServiceProvider.GetService(typeof(EnvDTE.DTE)); 
var activeSolutionProjects = (Array)dte.ActiveSolutionProjects; 
var dteProject = (EnvDTE.Project)activeSolutionProjects.GetValue(0); 
var defaultNamespace = dteProject.Properties.Item("DefaultNamespace").Value; 
4

Cómo he hecho esto:

<#@ assembly name="EnvDTE" #> 
<#@ import namespace="EnvDTE" #> 

<# 
    // Get value of 'Custom Tool Namespace' 
    var serviceProvider = (IServiceProvider)this.Host; 
    var dte = (DTE)serviceProvider.GetService(typeof(DTE));  
    var Namespace = dte.Solution.FindProjectItem(this.Host.TemplateFile).Properties.Item("CustomToolNamespace").Value; 
#> 

namespace <#= Namespace #> { 

} 
Cuestiones relacionadas