2009-07-20 8 views
16

Avec la génération de code T4, est-il possible d'accéder aux types définis dans le projet en cours?Génération de code T4: types d'accès au projet en cours

Par exemple, si j'ai une interface et je veux déléguer sa mise en œuvre à une autre classe, à savoir

interface IDoSomething { 
    public void do_something(); 
} 

class DoSomethingImpl : IDoSomething { 
    public void do_something() { 
     // implementation... 
    } 
} 

class SomeClass : IDoSomething { 
    IDoSomething m_doSomething = new DoSomethingImpl(); 

    // forward calls to impl object 
    public void do_something() { 
     m_doSomething.do_something(); 
    } 
} 

Je voudrais automatiser le transfert d'appel en SomeClass avec la génération de code; Est-ce possible?

+0

Demandez-vous comment vous feriez Si ce code n'a pas été généré. Ensuite, prenez cette solution et faites-la générer par le template. –

+3

@John Saunders: ce commentaire était plutôt inutile, n'est-ce pas? –

+0

Je ne pensais pas que c'était. Peut-être que vous avez comment faire cela, mais tout le monde ne comprend pas le processus de démarrage à partir de quelque chose qui fonctionne, puis le paramétrage dans un modèle. –

Répondre

20

Je recommanderais d'utiliser CodeModel. Voici un example. Restez loin de la réflexion, T4 verrouillera les binaires compilés. Si CodeModel ne fonctionne pas pour ce que vous essayez de faire, essayez Introspection (example).

+0

Je lis l'exemple, mais GetEnum ne semble pas être défini n'importe où que je peux comprendre? – Maslow

+4

La réflexion devient viable dans Vs2010 SP1 il apparaît. – Maslow

+0

CodeModel semble être l'approche la plus propre. –

0

Bien que cela ne marche pas à résoudre les problèmes de verrouillage (bien que ive entendu que VS2010 ne), vous pouvez essayer de copier le dll à un emplacement temporaire et il suffit d'utiliser cet ensemble copié ..

<#@ template debug="false" hostspecific="false" language="C#" #> 
<#@ output extension=".txt" #> 
<#@ import namespace="System.Reflection" #> 
<#@ import namespace="System.IO" #> 
<#  
var newFileName = System.IO.Path.GetTempFileName(); 
System.IO.File.Copy(@"C:\Development\CustomAssembly.dll",newFileName,true); 

var assembly = Assembly.LoadFrom(newFileName); 
var type = assembly.GetType("CustomAssembly.DummyClass"); 
#> 
<#=newFileName#> 
<#=type#>