2009-07-20 5 views
16

Usando la generación de código T4, ¿es posible acceder a los tipos definidos en el proyecto actual?Generación de código T4: tipos de acceso en el proyecto actual

Por ejemplo, si tengo una interfaz y quiero delegar su ejecución a otra clase, es decir

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

quisiera automatizar el desvío de llamadas en SomeClass con la generación de código; ¿es posible?

+0

Pregúntese cómo lo haría esto si no fuera código generado. Luego toma esa solución y haz que la plantilla la genere. –

+3

@ John Saunders: este comentario fue bastante inútil, ¿no? –

+0

No pensé que lo fuera. Tal vez "tú" obtienes cómo hacerlo, pero no todos entienden el proceso de comenzar con algo que funciona, y luego parametrizarlo en una plantilla. –

Respuesta

20

Recomendaría usar CodeModel. Aquí hay un example. Aléjese de Reflection, T4 bloqueará los binarios compilados. Si CodeModel no funciona para lo que intenta hacer, intente Introspection (example).

+0

Estoy leyendo el ejemplo, pero GetEnum no parece estar definido en ningún lugar que pueda figurar. – Maslow

+4

La reflexión se vuelve viable en Vs2010 SP1, aparece. – Maslow

+0

CodeModel parece ser el enfoque más limpio. –

0

Aunque ésto no resuelve los problemas de bloqueo (aunque me han dicho que hace VS2010), podría intentar copiar el archivo DLL a una ubicación temporal y sólo tiene que utilizar esa asamblea copiado ..

<#@ 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#> 
Cuestiones relacionadas