2009-07-20 6 views
16

Mit der T4-Codegenerierung kann auf die im aktuellen Projekt definierten Typen zugegriffen werden.T4-Codegenerierung: Zugriffstypen im aktuellen Projekt

Zum Beispiel, wenn ich eine Schnittstelle haben und ich mag ihre Umsetzung in einer anderen Klasse delegieren, das heißt

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(); 
    } 
} 

Ich mag würde die Anrufweiterleitung in SomeClass mit Code-Generierung automatisieren; Ist das möglich?

+0

Fragen Sie sich, wie Sie das tun würde dies, wenn es kein generierter Code wäre. Dann nimm diese Lösung und lasse die Vorlage von ihr generieren. –

+3

@John Saunders: Dieser Kommentar war ziemlich nutzlos, oder? –

+0

Ich dachte nicht, dass es war. Vielleicht _you_ bekommen, wie man das macht, aber nicht jeder versteht den Prozess, von etwas zu beginnen, das funktioniert, und es dann in einer Schablone zu parametrisieren. –

Antwort

20

Ich würde CodeModel empfehlen. Hier ist ein example. Bleiben Sie weg von Reflection, T4 wird die kompilierten Binärdateien sperren. Wenn CodeModel nicht für das, was Sie versuchen, funktioniert, versuchen Sie es mit Introspection (example).

+0

Ich lese das Beispiel, aber GetEnum scheint nirgends definiert zu sein, dass ich mir vorstellen kann? – Maslow

+4

Reflection wird in Vs2010 SP1 realisierbar es erscheint. – Maslow

+0

CodeModel scheint der sauberste Ansatz zu sein. –

0

Während dieses nicht die Sperr Probleme lösen (obwohl ive gehört, dass VS2010 der Fall ist), können Sie die DLL in einem temporären Speicherort versuchen zu kopieren und verwenden nur die kopiert Montage ..

<#@ 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#> 
Verwandte Themen