¿Cómo generar espacios de nombres en plantillas T4?


Tengo una plantilla T4 para una clase configurada con la herramienta personalizada TextTemplatingFileGenerator en Visual Studio:

<#@ 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 Tool Namespace" en Visual Studio, para no tener que codificar el espacio de nombres?

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

Author: Hallgrim, 2010-01-11

6 answers

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");
 48
Author: GarethJ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-18 01:54:02

Esto es lo que puedes hacer con T4 Toolbox :

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

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

Si prefiere usar la propiedad de Espacio de nombres de Herramienta personalizada, puede pasar Host.TemplateFile para el método GetCustomToolNamespace publicado por @ sixlettervariables.

 13
Author: Oleg Sych,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-13 00:13:18

Damien Guard incluye algún código en una publicación de blog que recupera el Espacio de nombres de la Herramienta Personalizada para un archivo dado :

public override String GetCustomToolNamespace(string fileName)
{
    return dte.Solution.FindProjectItem(fileName).Properties.Item("CustomToolNamespace").Value.ToString();
}
 8
Author: user7116,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-11 22:48:54

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 #> {

}
 4
Author: Damian Drygiel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-12 13:58:15

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

 2
Author: alduar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-20 10:00:42

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;
 0
Author: Nick Prince,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-30 16:16:03