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

У меня есть шаблон 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
    }
}

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

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

30
задан Hallgrim 11 January 2010 в 22:25
поделиться

3 ответа

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

System.Runtime.Remoting.Messaging.CallContext.LogicalGetData("NamespaceHint");
48
ответ дан 27 November 2019 в 23:22
поделиться

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

public override String GetCustomToolNamespace(string fileName)
{
    return dte.Solution.FindProjectItem(fileName).Properties.Item("CustomToolNamespace").Value.ToString();
}
8
ответ дан 27 November 2019 в 23:22
поделиться

Я бы установил Fiddler посередине, запустил запрос браузера и запрос .NET один за другим и убедился, что вы действительно получаете то, что думаете. Возможно, происходит перенаправление или что-то еще (возможно, браузер предварительно добавляет '/', пока .NET ждет перенаправления и т.д.), что не сразу видно. Я создал огромные приложения на HTTP-клиенте .NET, не имея ничего похожего на то, что вы описали - должно быть, происходит что-то еще.

Что произойдет, если вы прикрепите '/' к концу URL-адреса?

-121--3383596-

Это хорошая статья для объяснения философии VIM.

-121--4104000-

Вот что можно сделать с помощью свойства T4 Toolbox :

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

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

Если предпочитает использовать свойство Custom Tool Namespace, можно передать Host.TemplateFile методу GetCustomToolNamespace, размещенному @ sixlettervariables.

13
ответ дан 27 November 2019 в 23:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: