如何在T4模板中输出命名空间?

时间:2010-01-11 14:17:26

标签: c# visual-studio code-generation t4

我在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#项目的默认命名空间感到满意。

6 个答案:

答案 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;