Matt Ward

T4 Import Directive - Namespace Alias

How do you specify a namespace alias when using the Import directive in a T4 template?

The Import directive in a T4 template is used to bring a namespace into scope for any code that will be run when the T4 template is processed. Here is an example template that imports the System.IO namespace without using a namespace alias.

<#@ template language="C#" #> 
<#@ output extension=".txt" #> 
<#@ import namespace="System.IO" #> 
<# 
 string text = File.ReadAllText(@"d:\MyFile.txt"); 
#> 
File content: <#= text #>

The T4 template reads all the text in the d:\MyFile.txt which is then saved in the file generated by the template.

If you want to use a namespace alias you can specify it in the import directive in a similar way to how it is done with C# or VB.NET. Here is the example template modified so that an alias of IO is used for the System.IO namespace.

<#@ template language="C#" #> 
<#@ output extension=".txt" #> 
<#@ import namespace="IO = System.IO" #> 
<# 
 string text = IO.File.ReadAllText(@"d:\temp\test.xsd"); 
#> 
File content: <#= text #>

Why does this Work?

T4 templates use the CodeDom to generate C# or VB.NET code which is then executed as the template is processed. When the T4 templating engine processes the Import directive it creates a CodeNamespaceImport Object and passes it the Namespace attribute's value. The CodeNamespaceImport object supports generating a namespace alias when you specify a string of the form "Alias = Namespace" and pass this to its constructor.