Подтвердить что ты не робот

Как вывести пространство имен в шаблонах T4?

У меня есть шаблон T4 для класса, настроенного с помощью TextTemplatingFileGenerator Custom Tool в 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
    }
}

Как я могу получить значение свойства "Custom Namespace" в Visual Studio, поэтому мне не нужно жестко кодировать пространство имен?

Я даже был бы доволен пространством имен по умолчанию для проекта С#.

4b9b3361

Ответ 1

Если вы используете Visual Studio 2010, вы можете получить пространство имен, проверив свойство CallContext "NamespaceHint".

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

Ответ 2

Вот что вы можете сделать с T4 Toolbox:

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

Свойство DefaultNamespace класса TransformationContext возвращает строку с пространством имен на основе корневого пространства имен вашего проекта и местоположения вашего файла .tt в нем (т.е. рассматривает папки как пространства имен). Таким образом, вам не нужно указывать свойство Custom Namespace для каждого экземпляра вашего файла .tt.

Если вы предпочитаете использовать свойство пространства имен пользовательского инструмента, вы можете передать Host.TemplateFile методу GetCustomToolNamespace, опубликованному @sixlettervariables.

Ответ 4

Как я это сделал:

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

}

Ответ 5

Если вы используете Visual Studio 2012

EdmItemCollection ItemCollection = loader.CreateEdmItemCollection(inputFile);
string namespaceName = System.Runtime.Remoting.Messaging.CallContext.LogicalGetData("NamespaceHint").ToString();

EntityFrameworkTemplateFileManager fileManager = EntityFrameworkTemplateFileManager.Create(this);

Альдо Флорес @alduar

Ответ 6

Принятый ответ не работает в проектах Visual Basic. Мне пришлось использовать этот метод из: 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;