Comment afficher 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 de 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é "Custom Tool Namespace" dans Visual Studio, donc je n'ai pas à coder dur l'espace de noms?
je serais même content de l'espace de noms par défaut pour le projet C#.
6 réponses
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");
Voici ce que vous pouvez faire avec Boîte À Outils T4:
<#@ template language="C#v3.5" hostspecific="True" debug="True" #>
<#@ include file="T4Toolbox.tt" #>
<#
var namespaceName = TransformationContext.DefaultNamespace;
#>
propriété DefaultNamespace de la classe TransformationContext renvoie une chaîne avec namespace basée sur le namespace racine de votre projet et l'emplacement de votre .TT file in it (i.e. it treats folders as namespaces). De cette façon, vous n'avez pas à spécifier la propriété custom Tool Namespace pour chaque instance de votre .TT file.
Si vous préférez pour utiliser la propriété Custom Tool Namespace, vous pouvez passer de l'Hôte.TemplateFile à la GetCustomToolNamespace méthode posté par @sixlettervariables.
Damien Guard inclut du code dans un billet de blog qui récupère le Namespace de L'outil personnalisé pour un fichier donné:
public override String GetCustomToolNamespace(string fileName)
{
return dte.Solution.FindProjectItem(fileName).Properties.Item("CustomToolNamespace").Value.ToString();
}
Comment je l'ai fait ceci:
<#@ 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 #> {
}
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
la réponse acceptée ne fonctionne pas sur les projets Visual Basic. J'ai dû utiliser la méthode: 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;