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);
        }
    }
}
posted @ 2026-01-09 15:53  slowstart  阅读(3)  评论(0)    收藏  举报