T4 模板语句块中方括号的语法

Syntax for square brackets in a T4 Template statement block

我想在 T4 模板中使用 System.Configuration 程序集来获取项目 App.config 中列出的连接字符串。但是,编译器似乎不接受语句块中的 [ ]。这是怎么做到的?

<#@ assembly name="System.Configuration" #>
<#@ import namespace="System.Configuration"#>

<#

   var connectionString = ConfigurationManager.ConnectionStrings["localconnection"].ConnectionString;

#>

TIA

如果您在设计时 运行 T4(自定义工具:TextTemplatingFilePreprocessor),模板代码将作为 VisualStudio 进程的一部分执行。 VisualStudio 正在加载 devenv.exe.config 而不是您的项目配置(您可以通过 AppDomain.CurrentDomain.SetupInformation.ConfigurationFile 检查)。

这就是为什么您会收到空引用异常 - 'localconnection' 连接字符串不在 devenv.exe.config 中。

您可以使用 ConfigurationManager.OpenMappedExeConfiguration:

加载您的项目配置文件
<#@ template debug="false" hostspecific="true" language="C#" #>
<#@ assembly name="System.Configuration" #>
<#@ import namespace="System.Configuration"#>
<#@ import namespace="System.IO" #>

<#
    string configPath = Path.Combine(Host.ResolveAssemblyReference("$(ProjectDir)"), "App.config");
    var configFileMap = new ExeConfigurationFileMap{ExeConfigFilename = configPath};    

    var config = ConfigurationManager.OpenMappedExeConfiguration(configFileMap, ConfigurationUserLevel.None);
    string connectionString = config.ConnectionStrings.ConnectionStrings["localconnection"].ConnectionString;

    WriteLine(connectionString);
#>

注意,必须是 hostspecific="true" 才能使用 Host 解析您的项目文件夹。