2009-07-20 4 views
16

T4 코드 생성을 사용하면 현재 프로젝트에 정의 된 유형에 액세스 할 수 있습니까?T4 코드 생성 : 현재 프로젝트의 액세스 유형

예를 들어, 내가 인터페이스를 가지고 있고 나는 코드 생성과 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

(필자 VS2010가하는 것을 듣고 있지만)이 나던 잠금 문제를 해결하는 동안, 당신은 임시 위치에 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#> 
관련 문제