Как изменить выходной файл в шаблоне T4? - PullRequest
1 голос
/ 10 мая 2019

Вот мой код, и он работает нормально, но он создает файл .cs в Enums.tt и имя файла Enums.generated.cs, но я хочу создать выходной файл в моем конкретном месте в проекте, как я могу добитьсяэтот?

Дайте мне знать, есть ли способ сделать это.Я искал это, но не нашел правильного решения.

<#@ template debug="true" hostSpecific="false" #>
<#@ output extension=".generated.cs" #>
<#@ Assembly Name="System.Data" #>
<#@ import namespace="System.Data" #>
<#@ import namespace="System.Data.SqlClient" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Text.RegularExpressions" #>

<#
    string tableName = "ContentTypeMaster";
    string columnId = "Id";
    string columnName = "Name";
    string connectionString = "Data Source=192.168.120.71;Initial Catalog=ErisWebsite;Persist Security Info=True;User ID=IM;Password=Intellimedia$#12;MultipleActiveResultSets=True;Connection Timeout=5000";
#>
using System;
using System.CodeDom.Compiler;

namespace ER.ErisCampaign.Enums
{
    /// <summary>
    /// <#= tableName #> auto generated enumeration
    /// </summary>
    public enum <#= tableName #>
    {
<#
    SqlConnection conn = new SqlConnection(connectionString);
    string command = string.Format("select {0}, {1} from {2} order by {0}", columnId, columnName, tableName);
    SqlCommand comm = new SqlCommand(command, conn);

    conn.Open();

    SqlDataReader reader = comm.ExecuteReader();
    bool loop = reader.Read();

    while(loop)
    {
#>      /// <summary>
        /// <#= reader[columnName] #> configuration setting.
        /// </summary>
        <#= Pascalize(reader[columnName]) #> = <#= reader[columnId] #><# loop = reader.Read(); #><#= loop ? ",\r\n" : string.Empty #>
<#
    }
#>  }
}
<#+
    private string Pascalize(object value)
    {
        Regex rx = new Regex(@"(?:[^a-zA-Z0-9]*)(?<first>[a-zA-Z0-9])(?<reminder>[a-zA-Z0-9]*)(?:[^a-zA-Z0-9]*)");
        return rx.Replace(value.ToString(), m => m.Groups["first"].ToString().ToUpper() + m.Groups["reminder"].ToString().ToLower());
    }


#>

1 Ответ

2 голосов
/ 10 мая 2019

Добавьте следующий метод в шаблон T4:

<#
public void SaveFile(string folder, string fileName, string content)
{
    using (FileStream fs = new FileStream(Path.Combine(folder, fileName), FileMode.Create))
    {  
        using (StreamWriter str = new StreamWriter(fs))
        {
        str.WriteLine(content);
        str.Flush();
        }
    }
}
#>

Добавьте следующие строки в конце вашего вывода (последний <# блок управления #>), чтобы предотвратить запись в дочерний узел и запись в пользовательский каталог / файл:

<#
SaveFile(folder, filename + ".cs", this.GenerationEnvironment.ToString());
this.GenerationEnvironment.Remove(0, this.GenerationEnvironment.Length);
#>

Этот проект содержит несколько примеров.

Обратите внимание, что он все равно добавит пустой дочерний узел, но в файл не записывается вывод.

...