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

30
demandé sur Hallgrim 2010-01-11 17:17:26

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");
48
répondu GarethJ 2013-05-18 01:54:02

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.

13
répondu Oleg Sych 2017-12-13 00:13:18

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();
}
8
répondu user7116 2010-01-11 22:48:54

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

}
4
répondu Damian Drygiel 2013-12-12 13:58:15

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

2
répondu alduar 2013-06-20 10:00:42

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;
0
répondu Nick Prince 2013-09-30 16:16:03