Ответ 1
Если вы используете Visual Studio 2010, вы можете получить пространство имен, проверив свойство CallContext "NamespaceHint".
System.Runtime.Remoting.Messaging.CallContext.LogicalGetData("NamespaceHint");
У меня есть шаблон 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, поэтому мне не нужно жестко кодировать пространство имен?
Я даже был бы доволен пространством имен по умолчанию для проекта С#.
Если вы используете Visual Studio 2010, вы можете получить пространство имен, проверив свойство CallContext "NamespaceHint".
System.Runtime.Remoting.Messaging.CallContext.LogicalGetData("NamespaceHint");
Вот что вы можете сделать с 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.
Damien Guard содержит некоторый код в блоге, в котором извлекает пространство имен пользовательского инструмента для данного файла:
public override String GetCustomToolNamespace(string fileName)
{
return dte.Solution.FindProjectItem(fileName).Properties.Item("CustomToolNamespace").Value.ToString();
}
Как я это сделал:
<#@ 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 #> {
}
Если вы используете Visual Studio 2012
EdmItemCollection ItemCollection = loader.CreateEdmItemCollection(inputFile);
string namespaceName = System.Runtime.Remoting.Messaging.CallContext.LogicalGetData("NamespaceHint").ToString();
EntityFrameworkTemplateFileManager fileManager = EntityFrameworkTemplateFileManager.Create(this);
Альдо Флорес @alduar
Принятый ответ не работает в проектах 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;