我正在阅读有关T4模板的内容。 我想知道我们是否可以从.cs文件(接口)读取并使用T4模板来生成接口实现?
我看过一些例子但没有关于从.cs文件中读取并使用.tt
生成另一个.cs文件的内容答案 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)
有几种方法可以做到这一点:
使用assembly和import指令来引用您的dll和定义类的命名空间。因此,您可以使用已编译的.NET代码(例如,您的项目)。如果某些类型/成员是私人的,请向reflection打个招呼。这很酷,因为你正在使用代码,可以编译(因为它已经编译)&amp;&amp;如果.cs依赖于汇编中的另一个类,您可以了解这些类。
您可以使用Code Model framework来解析* .cs。您可以在此处看到一些示例:T4 template for generating SQL view from C# enumeration