T4模板实现接口

时间:2014-01-22 15:03:42

标签: c# visual-studio t4

我正在阅读有关T4模板的内容。 我想知道我们是否可以从.cs文件(接口)读取并使用T4模板来生成接口实现?

我看过一些例子但没有关于从.cs文件中读取并使用.tt

生成另一个.cs文件的内容

2 个答案:

答案 0 :(得分: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
   }
}

答案 1 :(得分:0)

有几种方法可以做到这一点:

  1. 使用assemblyimport指令来引用您的dll和定义类的命名空间。因此,您可以使用已编译的.NET代码(例如,您的项目)。如果某些类型/成员是私人的,请向reflection打个招呼。这很酷,因为你正在使用代码,可以编译(因为它已经编译)&amp;&amp;如果.cs依赖于汇编中的另一个类,您可以了解这些类。

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