2009-07-20 2 views
16

T4コード生成を使用すると、現在のプロジェクトで定義されているタイプにアクセスできますか?T4コードの生成:現在のプロジェクトのアクセスタイプ

例えば、Iインターフェイスを持っていると私は、コード生成とSomeClassにコール転送を自動化したいすなわち

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

別のクラスへの実装を委任したい場合。これは可能ですか?

+0

あなたがどうなるか自問してみてくださいこれはコードが生成されていない場合はこれです。次に、その解決策を取ってテンプレートを生成させます。 –

+3

@ジョン・サンダース:このコメントはかなり役に立たなかったのですか? –

+0

私はそうは思わなかった。たぶんあなたはこれをやる方法を知っているかもしれませんが、誰もがうまくいくものから始めるプロセスを理解しておらず、それをテンプレートでパラメータ化することはありません。 –

答えて

20

CodeModelの使用をお勧めします。ここにはexampleがあります。 Reflectionから離れて、T4はコンパイルされたバイナリをロックします。 CodeModelが何をしようとしていない場合は、イントロスペクション(example)を試してください。

+0

私はこの例を読んでいますが、GetEnumはどこでも定義できるようには見えません。 – Maslow

+4

Vs2010 SP1では反射が実行可能になります。 – Maslow

+0

CodeModelは最もクリーンなアプローチです。 –

0

(IVEはVS2010がないことを聞いたが)このdoesntのは、ロックの問題を解決しながら、あなたは一時場所にDLLをコピーしようとすると、ちょうどそのコピーされたアセンブリを使用することができます。..

<#@ 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#> 
関連する問題