2010-01-11 71 views
29

我在Visual Studio中建立與TextTemplatingFileGenerator自定義工具類T4模板:如何在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#項目的默認命名空間感到滿意。

回答

47

如果您使用Visual Studio 2010,則可以通過檢查CallContext的「NamespaceHint」屬性來檢索名稱空間。

System.Runtime.Remoting.Messaging.CallContext.LogicalGetData("NamespaceHint"); 
+1

不幸的是,這個技巧在使用基於MSBuild的時候不起作用轉化系統(如圖所示:http://www.olegsych.com/2010/04/understanding-t4-msbuild-integration/)。遊民。 :( – 2013-08-17 04:24:02

+0

該功能使調試失敗 – 2017-05-01 20:10:09

13

這裏是你可以用T4 Toolbox做什麼:

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

TransformationContext類的DefaultNamespace的屬性返回命名空間基於字符串的在你的項目的根名稱空間和你的.tt文件的位置(即它將文件夾視爲名稱空間)。這樣您就不必爲.tt文件的每個實例指定自定義工具命名空間屬性。

如果您喜歡使用自定義工具Namespace屬性,你可以通過Host.TemplateFile張貼由@sixlettervariables的GetCustomToolNamespace方法。

+0

我得到的錯誤:「T4Toolbox.TransformationContext」不包含找到「DefaultNamespace的」 – 2014-04-04 08:59:32

+1

的定義在你的這篇文章中的修復: http://www.olegsych.com/2012/12/t4-toolbox-for-visual-studio-2012/ – 2014-04-04 09:25:01

2

如果您使用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

接受的答案並不在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; 
4

我怎麼做了這樣的:

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

}