86394


リフレクションで自分のプロジェクトのアセンブリの型を取得し、メンバを追加するT4テキストテンプレートを作成しました。  
実際、それはアセンブリさえあれば動作します。  
問題は、ビルドしないとアセンブリがないのでそれは動作しません。

一般的に自身の型にメンバを追加するコードを生成したい場合はどのようにするのでしょうか？

追記します。わかりづらくてすみません。  
以下のようなプロジェクトがあります。  
[![画像の説明をここに入力](https://i.stack.imgur.com/dlf3w.png)](https://i.stack.imgur.com/dlf3w.png)

ConsoleApp5のTextTemplate1.ttはConsoleApp5.exeから以下のようなコードを生成します。

[code]

    namespace ConsoleApp5.PartialClasses
    {
        public partial class Class1
        {
            // 中身
        }
        public partial class Class2
        {
            // 中身
        }
    }
    
[/code]

このテキストテンプレートはビルドされたConsoleApp5.exeがある場合に限り動作します。

**問題点**  
他のアセンブリ情報からコードを生成する場合は自動でコード生成をすることができます。  
例えばConsoleApp5にTextTemplate2.ttがあったとします。  
TextTemplate2.ttは同じソリューション内のプロジェクトのClassLibrary1.dllからコードを生成します。  
ClassLibrary1のビルド後イベントでTextTemplate2.ttのコードを生成することでテンプレートを手動で実行する必要がなくなります。

対して、TextTemplate1.ttは実行するためにConsoleApp5.exeが必要なため、自動で実行することができません。

実際にこれを運用する場合、以下のようなルールを設定する必要があると思っています。  
・TextTemplate1.ttは必要なときに手動で実行する  
・TextTemplate1.csをGitHubなどのソース管理に含める  
・コード生成に失敗した場合はTextTemplate1.csを手動で元に戻す

この認識は正しいですか？  
後、めんどくさいのでできれば自動で生成したいと思っているのですが、なにかわかることはありますでしょうか？


CC BY-SA 4.0
2022-02-15T04:57:38.847
86356
2022-02-16T11:34:01.687
2022-02-16T11:06:23.870
21330
21330
question
c#
自分のプロジェクトのpartial classにメンバを追加するコードを生成したい


T4でアセンブリ自身にメンバーを追加することはできません。アプローチを変える必要があります。

一応、直接的な回答としては、[ソース ジェネレーター](https://docs.microsoft.com/ja-
jp/dotnet/csharp/roslyn-sdk/source-generators-
overview)というものが登場していて、コンパイル時にコード生成できるようになっています。

* * *

ただし、`Class1.cs`、`Class2.cs`を工夫してそもそもコード生成せずに実装するアプローチもあるかもしれません。例えば、[既定のインターフェイスメソッド](https://docs.microsoft.com/ja-
jp/dotnet/csharp/language-reference/proposals/csharp-8.0/default-interface-
methods)が使えるかもしれません。実装したいpartialメソッドをインターフェースメンバーとして、更に既定のインターフェイスメソッドを持たせておけば、`Class1`側はそのインターフェースの実装を宣言するだけでpartialメソッドが提供されることになります。


CC BY-SA 4.0
2022-02-16T11:34:01.687
86394
2022-02-16T11:34:01.687
4236
86356
answer