31 votes

Comment sortir l'espace de noms dans les modèles T4?

J'ai un modèle T4 pour une classe configurée avec l'outil personnalisé TextTemplatingFileGenerator dans 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
    }
}
 

Comment puis-je obtenir la valeur de la propriété "Espace de noms d'outils personnalisés" dans Visual Studio, donc je n'ai pas à coder en dur l'espace de noms?

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

48voto

GarethJ Points 4261

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");
 

13voto

Oleg Sych Points 4303

Voici ce que vous pouvez faire avec T4 boîte à outils:

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

DefaultNamespace propriété de TransformationContext classe renvoie une chaîne de caractères avec l'espace de noms basé sur l'espace de noms racine de votre projet et l'emplacement de votre .tt de fichier (c'est à dire qu'il traite les dossiers que des espaces de noms). De cette façon, vous n'avez pas à spécifier l'Outil Personnalisé de l'espace de Noms de propriété pour chaque instance de votre .tt fichier.

Si vous préférez utiliser l'Outil Personnalisé de l'espace de Noms de la propriété, vous pouvez passer de l'Hôte.TemplateFile à la GetCustomToolNamespace méthode posté par @sixlettervariables.

Oleg

8voto

user7116 Points 39829

Damien Guard inclut du code dans un article de blog qui récupère l'espace de noms d'outils personnalisés pour un fichier donné :

 public override String GetCustomToolNamespace(string fileName)
{
    return dte.Solution.FindProjectItem(fileName).Properties.Item("CustomToolNamespace").Value.ToString();
}
 

6voto

Damian Drygiel Points 3230

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

}
 

2voto

alduar Points 11

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X