2014-01-22 76 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套件并将其转换为实现(具体)类? –