2014-01-22 117 views
1

我正在閱讀關於T4模板的東西。 我想知道是否有可能從.cs文件(接口)讀取並使用T4模板我們可以生成接口實現?T4模板實現接口

我已經看到了一些例子,但大約從cs文件讀取並沒有使用.TT生成另一個cs文件

+0

這是可能的,但最難的部分是解析C#文件......當Roslyn發佈時它可能會更容易。 –

回答

0

有幾種方法可以做到這一點:

  1. 隨着使用assemblyimport指令引用你的dll和你的類定義的命名空間。因此,您可以使用已編譯的.NET代碼(例如,您的項目)。如果某些類型/成員是私人的,請致電reflection。這是很酷的方式,因爲你正在處理代碼,可以編譯它(因爲它已經編譯)& &如果.cs依賴於彙編中的其他類,那麼可以瞭解這些類。

  2. 您可以使用Code Model framework解析* .cs。你可以在這裏看到一些例子:T4 template for generating SQL view from C# enumeration

2

如果沒有DLL接口,您可以直接在所得組件的T4產生和使用反射期間編譯的.cs代碼解析生成方法實施。

<#@ assembly name="System.Core" #> 
<#@ import namespace="System.CodeDom.Compiler" #> 
<#@ import namespace="System.IO" #> 
<#@ import namespace="System.Reflection" #> 
<#@ import namespace="Microsoft.CSharp" #> 
<#+ 
public class ImplementationGenerator 
{ 
    private Assembly interfaceAssembly; 

    public ImplementationGenerator(string interfaceCsFileName, string[] additionalAssemblyNames = null) 
    { 
     List<string> assemblyNames = new List<string>(new string[] { "System.dll", "System.Core.dll" }); 
     if (null != additionalAssemblyNames) 
     { 
      assemblyNames.AddRange(additionalAssemblyNames); 
     } 
     CompilerParameters parameters = new CompilerParameters(assemblyNames.ToArray()) 
     { 
      GenerateExecutable = false, 
      IncludeDebugInformation = false, 
      GenerateInMemory = true 
     }; 
     CSharpCodeProvider csProvider = new CSharpCodeProvider(); 
     CompilerResults interfaceResults = csProvider.CompileAssemblyFromFile(parameters, interfaceCsFileName); 
     if (interfaceResults.Errors.HasErrors) 
     { 
      string errorMessage = "The compiler returned the following errors:\n"; 
      foreach (CompilerError error in interfaceResults.Errors) 
      { 
       errorMessage += "\t"+error.ErrorText+"\n"; 
      } 
      throw new Exception(errorMessage); 
     } 
     interfaceAssembly = interfaceResults.CompiledAssembly; 
    } 

    public void Generate() 
    { 
     //use reflection to parse interfaceAssembly methods and generate the implementation 
    } 
} 
+0

你有你的Generate()方法的實現嗎?你如何把你的interfaceAss套件並將其轉換爲實現(具體)類? –