2010-01-11 7 views
29

J'ai un modèle T4 pour une classe mis en place avec TextTemplatingFileGenerator outil personnalisé dans Visual Studio:Comment afficher l'espace de noms dans les modèles 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 
    } 
} 

Comment puis-je obtenir la valeur de la propriété « Namespace Outil personnalisé » dans Visual Studio, donc je ne avoir à coder en dur l'espace de noms?

Je serais même content de l'espace de noms par défaut pour le projet C#.

Répondre

47

Si vous utilisez Visual Studio 2010, vous pouvez récupérer l'espace de noms en vérifiant la propriété "NamespaceHint" de CallContext.

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

Malheureusement, cette astuce ne fonctionne pas avec MSBuild. système de transformation (comme illustré ici: http://www.olegsych.com/2010/04/understanding-t4-msbuild-integration/). Bummer. :( –

+0

Cette fonction fait échouer le débogage –

13

Voici ce que vous pouvez faire avec T4 Toolbox:

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

propriété defaultNamespace de classe TransformationContext retourne une chaîne avec espace de noms sur l'espace de noms racine de votre projet et l'emplacement de votre fichier .tt (c'est-à-dire qu'il traite les dossiers comme des espaces de noms). De cette façon, vous n'avez pas besoin de spécifier la propriété Custom Tool Namespace pour chaque instance de votre fichier .tt.

Si vous préférez pour utiliser la propriété Custom Tool Namespace, vous pouvez passer Host.TemplateFile à la méthode GetCustomToolNamespace publiée par @sixlettervariables.

+0

Je reçois l'erreur: « T4Toolbox.TransformationContext » ne contient pas de définition pour « defaultNamespace » –

+1

Trouvé un correctif dans ce message: http://www.olegsych.com/2012/12/t4-toolbox-for-visual-studio-2012/ –

2

Si vous utilisez 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 réponse acceptée ne fonctionne pas sur les projets Visual Basic. Je devais utiliser la méthode 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

Comment je l'ai fait:

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

}