T4 template lockt de assembly

Ik moest van object A alle properties copieren naar object B.

Dat vind ik nooit zo leuk om te doen, het intypen van B.Naam = A.Naam, B.Adres = A.Adres etc.

En dan denk ik al snel aan code genereren. En het toeval wil, ik had laatst wat gelezen over T4 templates: daarmee kun je code genereren.

Dus direct geprobeerd en een bestand PersoonConverter.ttaangemaakt:


public class PersoonConverter

{

public PersoonB Convert(PersoonA prsa)

{

PersoonB prsb = new PersoonB ();

<#

// Get the type.

Object o = new PersoonA ();

Type t = o.GetType();

// Cycle through the properties.

foreach (PropertyInfo p in t.GetProperties( ))

{

if (p.CanWrite) {

#>

<#= string.Format("prsb.{0} = prsa.{0}", p.Name ) #>;

<#

}

}

#>

return l;

}

}

 
Wat staat er dan?

Alles in de PersoonConverter.tt file wordt verwerkt naar een PersoonConverter.cs file.

Alle gewone tekst wordt 1 op 1 getoond, en alles tussen <# #> echter wordt gerenderd.

En wat staat er hier tussen die tekens:

Neem een Type PersoonA, doorloop al z’n properties en voeg de tekst prsb.[property] = prsa.[property]; toen aan het uitvoer bestand.

Maar dan ben je er niet, want dan kent ‘ie natuurlijk PropertyInfo nog niet, dus voegen we daar een referentie naar toe bij:

<#@ import namespace = "System.Reflection" #> 

En daarna kent 'ie de class PersoonA nog niet, dus voegen we dit toe:

<#@ import namespace = "Converter.Model" #>

Maar die kent 'ie ook niet, dus voegen we een referentie toe naar de dll waar die namespace in zit:

<#@ assembly name = "Converter.Model.dll" #>

Maar nee, het moet een hard pad zijn, dus wordt het

<#@ assembly name = "C:\projects\Converter\bin\debug\Converter.Model.dll" #>

Et voila: de code wordt gegenereerd.

Klaar?

Nope, not quite, want de tweede keer met genereren lockt de T4 interpreter je DLL tijdens het compileren, maar die DLL moet ook worden gebuild!

Conclusie: je kunt je app niet meer builden.

De enige gevonden oplossing: sluiten en heropenen van je solution.

Bareuh….

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s