Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
0
Help us understand the problem. What are the problem?

Gtk3アプリ RiderとT4テンプレートでHelloWorld

T4テンプレートとは

Web言語にあるHTMLテンプレートエンジンのようなもの。
変数や配列を埋め込んで、For文で回してHTMLを出力したり、
テキストやCSクラスファイルを出力できる
クラスのテンプレートをC#とテキストで作り、CSのソースとして、Dllとして書き出すができる

ttファイルを追加する

Riderのエクスプローラーから右クリックから追加からT4ファイルを選択

dotnet-t4-new-file.png

ttファイルを開く

HelloWorldを記入します

test.tt
<#@ template language="C#" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
HelloWorld

NugetからSystem.CodeDomをインストール

Screenshot from 2021-09-15 14-37-44.png
System.CodeDomをインストールしてください。
インストールしていないとコンパイル時に'System.CodeDom.Compiler' に見つかりませんでしたとエラーが出ます。

型名 'CompilerErrorCollection' は名前空間 'System.CodeDom.Compiler' に見つかりませんでした。
この型はアセンブリ 'System.CodeDom, Version=0.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51' 
に転送されました。このアセンブリへの参照を追加することを検討してください。

ttファイルを実行

Preprocess Templateから実行

dotnet-t4-execute.png

実行

CSの従属ファイルが生成されます。
Screenshot from 2021-09-15 14-33-24.png

テキストを出力するコードを書く

適当なところにクラスを宣言し、TransformText()を呼び出すとテンプレートの内容が出力されます。
System.CodeDomがNugetからインストールしていないとTransformTextでエラーが出ます。

*.cs
test test = new test();
var a = test.TransformText();
Console.WriteLine(a);

Screenshot from 2021-09-15 14-36-14.png

変数に値を入れる。コンストラクター変数を入れてttの中で表示する

従属クラスはpartialクラスのため、後付でクラスの内容を追加することができます。
コンストラクターやSetterを追加します。

test.cs
namespace T4SapmleGtkApp
{
   partial class test
    {
        public string TestText1;

        private string TestText2;
        public test(string data)
        {
            this.TestText2 = data;
        }
    }
    class MainWindow : Window
    {
        public MainWindow() : this(new Builder("MainWindow.glade"))
        {
            test test = new test("2222");
            test.TestText1 = "1111";
            var a = test.TransformText();
            Console.WriteLine(a);
        }
    }

TTファイルの中では<#=  #>でC#の領域にして表示します。

test.tt

<#= TestText1 #>

<#= TestText2 #>

For文の使い方

<# #>内がC#の領域
<#= val #>内がC#の変数1つまで表示する
それ以外はテキストを表示する

<# var val = "test"; #>
<# for (int i = 1; i <= 10; i++){ #>
        test <#= val #> <#= i #>          
<# } #>

参考資料

Gtk3アプリ TextView TreeViewにスクロールバーを表示するに続く

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
0
Help us understand the problem. What are the problem?