C#调用T4模板(.tt)
官方文档:使用 T4 文本模板的运行时文本生成
添加引用System.CodeDom
System.CodeDom
编写模板.tt
新建AndroidDaoGen.tt。右键属性,修改自定义工具值为TextTemplatingFilePreprocessor。
<#@ template language="C#" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#
var firstCh = className[0];
var className2 = char.IsUpper(firstCh)?char.ToLower(firstCh)+className.Substring(1):className;
#>
import androidx.room.Dao
import androidx.room.Delete
import androidx.room.Insert
import androidx.room.Query
@Dao
interface <#= className #>Dao {
@Query("SELECT * FROM <#= className2 #>")
suspend fun getAll(): List<<#= className #>>
@Query("SELECT * FROM <#= className2 #> WHERE id = :id")
fun getById(id: Int): <#= className #>
@Query("SELECT * FROM <#= className2 #> WHERE id IN (:ids)")
fun getByIds(ids: IntArray): List<<#= className #>>
@Insert
fun insertAll(vararg <#= className2 #>s: <#= className #>)
@Insert
fun insert(<#= className2 #>: <#= className #>): Long
@Delete
fun delete(<#= className2 #>: <#= className #>)
@Delete
suspend fun deleteAsync(<#= className2 #>: <#= className #>): Int
@Delete
fun deleteList(list:List<<#= className #>>): Int
}
className是需要传递的参数。
传递参数
新建AndroidDaoGen的分部类,AndroidDaoGenCode.cs。构造函数里传递className参数。
public partial class AndroidDaoGen
{
private string className;
public AndroidDaoGen(string className)
{
this.className = className;
}
}
调用生成代码
internal class Program
{
static void Main(string[] args)
{
string[] arr = new string[] { "User" };
var path = @"D:\";
foreach (var item in arr)
{
AndroidDaoGen gen = new AndroidDaoGen(item);
var str = gen.TransformText();
File.WriteAllText(Path.Combine(path, $"{item}Dao.kt"), str);
}
}
}
浙公网安备 33010602011771号