Как вывести пространство имен в шаблонах T4? - PullRequest
30 голосов
/ 11 января 2010

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

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

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

Ответы [ 6 ]

48 голосов
/ 05 июня 2010

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

System.Runtime.Remoting.Messaging.CallContext.LogicalGetData("NamespaceHint");
13 голосов
/ 12 января 2010

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

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

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

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

8 голосов
/ 12 января 2010

Damien Guard включает некоторый код в сообщение блога, который извлекает пространство имен пользовательского инструмента для данного файла :

public override String GetCustomToolNamespace(string fileName)
{
    return dte.Solution.FindProjectItem(fileName).Properties.Item("CustomToolNamespace").Value.ToString();
}
5 голосов
/ 12 декабря 2013

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

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

}
2 голосов
/ 20 июня 2013

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

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

EntityFrameworkTemplateFileManager fileManager = EntityFrameworkTemplateFileManager.Create(this);

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

0 голосов
/ 30 сентября 2013

Принятый ответ не работает в проектах 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;
...