2009-07-20 15 views
16

T4 kodu nesli kullanılarak mevcut projede tanımlanmış türlere erişmek mümkün mü?T4 kod üretimi: Geçerli projedeki erişim türleri

Örneğin, bir arabirim ve ben kod üretimi ile SomeClass çağrı yönlendirmesini otomatik istiyoruz yani

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

başka bir sınıfa uygulanmasını, temsilci istiyorum; Mümkün mü?

+0

yapardın nasıl kendinize sorun Bu kod üretilmemişse. Sonra bu çözümü alın ve şablonun oluşturmasını sağlayın. –

+3

@John Saunders: Bu yorum işe yaramazdı, değil mi? –

+0

Ben öyle olduğunu düşünmedim. Belki de bunu nasıl yapacaksınız, ama herkes, işe yarayan bir şeyden yola çıkma sürecini anlar, sonra da bir şablonda parametrelendirir. –

cevap

20

CodeModel'i kullanmanızı öneririm. İşte bir example. Yansımadan uzak durun, T4 derlenmiş ikili dosyaları kilitleyecektir. CodeModel yapmaya çalıştığınız şey için çalışmazsa, Introspection (example) 'ı deneyin.

+0

Örneği okuyorum, ancak GetEnum, çizebileceğim herhangi bir yerde tanımlanmış gibi görünmüyor mu? – Maslow

+4

Yansıma Vs2010 SP1'de geçerli olur. – Maslow

+0

CodeModel en temiz yaklaşım gibi görünüyor. –

0

(ive VS2010 yaptığı duyduğumuz rağmen) bu doesnt kilitleme sorunları çözmek de, bir geçici konuma dll kopyalamak denemek ve sadece bu kopyalanan montaj kullanabilirsiniz ..

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