我正在阅读关于T4模板的东西。 我想知道是否有可能从.cs文件(接口)读取并使用T4模板我们可以生成接口实现?T4模板实现接口
我已经看到了一些例子,但大约从cs文件读取并没有使用.TT生成另一个cs文件
我正在阅读关于T4模板的东西。 我想知道是否有可能从.cs文件(接口)读取并使用T4模板我们可以生成接口实现?T4模板实现接口
我已经看到了一些例子,但大约从cs文件读取并没有使用.TT生成另一个cs文件
有几种方法可以做到这一点:
随着使用assembly和import指令引用你的dll和你的类定义的命名空间。因此,您可以使用已编译的.NET代码(例如,您的项目)。如果某些类型/成员是私人的,请致电reflection。这是很酷的方式,因为你正在处理代码,可以编译它(因为它已经编译)& &如果.cs依赖于汇编中的其他类,那么可以了解这些类。
您可以使用Code Model framework解析* .cs。你可以在这里看到一些例子:T4 template for generating SQL view from C# enumeration
如果没有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
}
}
你有你的Generate()方法的实现吗?你如何把你的interfaceAss套件并将其转换为实现(具体)类? –
这是可能的,但最难的部分是解析C#文件......当Roslyn发布时它可能会更容易。 –