Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Inheriting a T4 template from a custom base class, providing Visual Studio 2010 SDK is not installed

I have a system of T4 templates — executed at run-time, not at compile-time — which generate the skeletons of many classes in my app. All these templates reside in a generator tool which is used from time to time to pre-generate new classes into the destination app. The tool contains a configuration class whose properties parameterize the output of all T4 templates.

Originally the configuration class was a static class. However, as the class generator tool grows, it's better to make it non-static and rather make a new instance for each use. The problem is how to pass this instance to the instances of T4 templates. The natural way seems to be inheriting them from a common base which would be provisioned with the configuration class instance.

The problem is that the TextTransformation class, which would have been inherited by my custom T4 base class, is located in an assembly which (according to sources like this SO question) doesn't ship with Visual Studio 2010. Instead it's provided within the Visual Studio 2010 SDK.

The base class generated by VS2010, although itself having no ancestor, isn't partial so there's no way to 'inject' the custom ancestor via another partial declaration.

Thus the question is: Is there a way to inherit a run-time-executed T4 template from a custom base class without the need to install Visual Studio 2010 SDK?

Disclaimer: I'm not very familiar with T4, so I might be completely wrong about how to approach the problem. Hence any other architectural advice is welcome, although my aim isn't to create a super-architected generator — it's just a helper tool, which shall be simple and understandable to the occasional reader.

like image 836
Ondrej Tucny Avatar asked Jan 14 '11 20:01

Ondrej Tucny


People also ask

What is T4 code generation?

In Visual Studio, a T4 text template is a mixture of text blocks and control logic that can generate a text file. The control logic is written as fragments of program code in Visual C# or Visual Basic.

What is TT file in C#?

TT stands for - Visual Studio Text Template is a software development tool created by the Microsoft. Further explanation - TT file contains text block and control logic used for generating new files. To write the Text Template file we can use either - Visual C# or Visual Basic Code.


1 Answers

The solution is actually very simple — the base class can be implemented as a T4 template itself and inherited. Like this:

Base template:

<#@ template language="C#" #>
<#+ 

    public Config Config { get; set; }

#>

Inherited template:

<#@ template language="C#" inherits="BaseTemplate" #>
...
<#= Config.SomeProperty #>
...

Once the template is instantiated the properties declared in the base template are provisioned to the actual configuration.

like image 57
Ondrej Tucny Avatar answered Sep 22 '22 13:09

Ondrej Tucny