我正在閱讀關於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發佈時它可能會更容易。 –