我在Visual Studio中使用TextTemplatingFileGenerator自定义工具设置了一个T4模板:
<#@ 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#项目的默认命名空间感到满意。
答案 0 :(得分:48)
如果您使用的是Visual Studio 2010,则可以通过检查CallContext的“NamespaceHint”属性来检索命名空间。
System.Runtime.Remoting.Messaging.CallContext.LogicalGetData("NamespaceHint");
答案 1 :(得分:13)
以下是您可以使用T4 Toolbox:
执行的操作<#@ template language="C#v3.5" hostspecific="True" debug="True" #>
<#@ include file="T4Toolbox.tt" #>
<#
var namespaceName = TransformationContext.DefaultNamespace;
#>
TransformationContext类的DefaultNamespace属性返回一个带有名称空间的字符串,该名称空间基于项目的根命名空间和.tt文件的位置(即它将文件夹视为名称空间)。这样,您就不必为.tt文件的每个实例指定自定义工具命名空间属性。
如果您更喜欢使用自定义工具命名空间属性,则可以将Host.TemplateFile传递给@sixlettervariables发布的GetCustomToolNamespace方法。
答案 2 :(得分:8)
Damien Guard在博客文章中包含了一些retrieves the Custom Tool Namespace for a given file:
的代码public override String GetCustomToolNamespace(string fileName)
{
return dte.Solution.FindProjectItem(fileName).Properties.Item("CustomToolNamespace").Value.ToString();
}
答案 3 :(得分:5)
我是怎么做到的:
<#@ 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 :(得分:2)
如果您使用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
答案 5 :(得分:0)
接受的答案不适用于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;