C#テンプレート完全ガイド|初心者向けに使い方・作成方法・実践例をわかりやすく解説
はじめに
C#テンプレートとは、毎回同じように作成するコードやプロジェクト構成を、ひな形として再利用するための仕組みです。
C#開発では、クラス、インターフェース、Web API、テストコード、Repositoryクラス、DTO、設定ファイルなど、似た構造のコードを何度も作る場面があります。そのたびに手作業で書いていると、時間がかかるだけでなく、命名ミスや記述漏れも起こりやすくなります。
そこで役立つのがC#テンプレートです。Visual Studioの標準テンプレートを使えば、プロジェクトやクラスをすぐに作成できます。さらに、自分でカスタムテンプレートを作れば、業務やチームのルールに合わせたコードを自動生成できます。
この記事では、「c# テンプレート」と検索している初心者に向けて、C#テンプレートの基本、Visual Studioでの使い方、項目テンプレートの作成方法、dotnet newテンプレート、ジェネリック、T4テンプレート、実践例、よくあるエラーまでわかりやすく解説します。
1. C#テンプレートとは?初心者がまず理解すべき基本
C#テンプレートとは、C#で使うコードやプロジェクトのひな形のことです。
たとえば、Visual Studioで「コンソールアプリ」を選んで新しいプロジェクトを作成すると、Program.csや.csprojファイルが自動で用意されます。これもプロジェクトテンプレートの一種です。
また、「クラス」を追加すると、次のようなコードが自動生成されます。
C#namespace SampleApp;
public class User
{
}
このように、よく使う構造を自動で作ってくれる仕組みがC#テンプレートです。
1-1. C#で「テンプレート」と呼ばれるものの種類
C#でテンプレートと呼ばれるものには、主に次の種類があります。
・Visual Studioのプロジェクトテンプレート
・Visual Studioの項目テンプレート
・クラスやインターフェースのテンプレート
・.NET CLIのdotnet newテンプレート
・T4テキストテンプレート
・ジェネリッククラス、ジェネリックメソッド
・コードスニペット
初心者が最初に覚えるべきなのは、Visual Studioのプロジェクトテンプレートと項目テンプレートです。次に、コードの重複を減らすためにジェネリックを理解すると、C#らしい書き方ができるようになります。
1-2. Visual Studioのテンプレートと.NET CLIテンプレートの違い
Visual Studioのテンプレートは、画面操作でプロジェクトやファイルを作成するためのテンプレートです。
一方、.NET CLIテンプレートは、コマンドラインで使うテンプレートです。
Bashdotnet new console
dotnet new webapi
dotnet new classlib
たとえば、上記のように入力すると、コンソールアプリ、Web API、クラスライブラリなどを作成できます。
Visual StudioテンプレートはGUI中心、.NET CLIテンプレートはコマンド中心と考えるとわかりやすいです。チーム開発や自動化では、dotnet newテンプレートのほうが共有しやすい場合があります。
1-3. C++のtemplateとC#のジェネリックの違い
C#の「テンプレート」という言葉で混乱しやすいのが、C++のtemplateとの違いです。
C++には、次のようなtemplate構文があります。
C++template <typename T>
T Add(T a, T b)
{
return a + b;
}
一方、C#ではC++のtemplateに近い役割を、ジェネリックが担います。
C#public class Box<T>
{
public T Value { get; set; }
}
C#にはC++と同じtemplate構文はありません。C#で型を汎用化したい場合は、ジェネリッククラスやジェネリックメソッドを使います。
1-4. テンプレートを使うメリット・デメリット
C#テンプレートを使うメリットは、開発効率を上げられることです。
同じようなコードを毎回書かなくてよくなり、命名規則やフォルダ構成も統一しやすくなります。チーム全体で同じテンプレートを使えば、コードレビューもしやすくなります。
一方で、テンプレートを増やしすぎると管理が難しくなります。古い設計のテンプレートが残っていると、間違ったコードが量産されることもあります。
テンプレートは便利ですが、作った後の保守も重要です。
2. C#テンプレートの主な種類と使い分け
C#テンプレートには複数の種類があります。目的に応じて使い分けることが大切です。
2-1. プロジェクトテンプレート
プロジェクトテンプレートは、アプリケーションやライブラリ全体のひな形です。
例として、次のようなものがあります。
・コンソールアプリ
・クラスライブラリ
・ASP.NET Core Web API
・Blazorアプリ
・Windows Formsアプリ
・WPFアプリ
・xUnitテストプロジェクト
新しい開発を始めるときは、まずプロジェクトテンプレートを選びます。
2-2. 項目テンプレート
項目テンプレートは、プロジェクト内に追加するファイルのひな形です。
たとえば、次のような項目があります。
・クラス
・インターフェース
・列挙型
・レコード
・コントローラー
・Razorページ
・設定ファイル
Visual Studioで「追加」→「新しい項目」を選ぶと、項目テンプレートを使ってファイルを追加できます。
2-3. クラステンプレート
クラステンプレートは、クラスファイルのひな形です。
標準のクラスだけでなく、次のような独自テンプレートを作ることもできます。
C#namespace $rootnamespace$;
public class $safeitemrootname$
{
public Guid Id { get; set; } = Guid.NewGuid();
public DateTime CreatedAt { get; set; } = DateTime.UtcNow;
public DateTime UpdatedAt { get; set; } = DateTime.UtcNow;
}
共通プロパティを持つEntityクラスなどを作るときに便利です。
2-4. T4テキストテンプレート
T4テキストテンプレートは、テキストやコードを自動生成するためのテンプレートです。
拡張子は「.tt」です。C#のコードをテンプレート内に埋め込み、ループや条件分岐を使ってファイルを生成できます。
DTO、設定ファイル、SQL、HTML、C#コードなどを生成したい場合に使われます。
2-5. ジェネリッククラス・ジェネリックメソッド
ジェネリックは、型を後から指定できる仕組みです。
C#public class Repository<T>
{
private readonly List<T> _items = new();
public void Add(T item)
{
_items.Add(item);
}
public IEnumerable<T> GetAll()
{
return _items;
}
}
User用、Product用、Order用に似たRepositoryを何度も作るのではなく、Repository<T>として共通化できます。
3. Visual StudioでC#テンプレートを使う方法
Visual Studioを使うと、C#テンプレートを画面操作だけで簡単に利用できます。
3-1. 新しいプロジェクト作成時にテンプレートを選ぶ手順
Visual Studioでプロジェクトテンプレートを使う手順は次のとおりです。
1. Visual Studioを起動する
2. 「新しいプロジェクトの作成」をクリックする
3. 言語で「C#」を選ぶ
4. 種類から「コンソール」「Web」「デスクトップ」などを選ぶ
5. 使いたいテンプレートを選択する
6. プロジェクト名と保存場所を入力する
7. .NETのバージョンを選ぶ
8. 「作成」をクリックする
初心者は、まず「コンソールアプリ」テンプレートから始めるのがおすすめです。
3-2. クラスやインターフェースなどの項目テンプレートを追加する手順
既存プロジェクトにクラスを追加する場合は、次の手順で行います。
1. ソリューションエクスプローラーで対象プロジェクトを右クリックする
2. 「追加」→「新しい項目」を選ぶ
3. 「クラス」「インターフェース」「列挙型」などを選ぶ
4. ファイル名を入力する
5. 「追加」をクリックする
これで、名前空間やクラス名が入ったC#ファイルが自動生成されます。
3-3. テンプレートが表示されないときの確認ポイント
テンプレートが表示されない場合は、次の点を確認してください。
・C#のワークロードがインストールされているか
・対象の.NET SDKがインストールされているか
・Visual Studioのフィルター条件が絞り込まれすぎていないか
・テンプレートの配置場所が正しいか
・Visual Studioを再起動したか
・テンプレートキャッシュが古くなっていないか
特に、ASP.NET Coreやデスクトップアプリのテンプレートが出ない場合は、Visual Studio Installerで必要なワークロードを追加する必要があります。
3-4. 初心者におすすめの標準テンプレート
初心者におすすめのC#テンプレートは次のとおりです。
・コンソールアプリ
・クラスライブラリ
・ASP.NET Core Web API
・xUnitテストプロジェクト
・Windows Formsアプリ
最初はコンソールアプリでC#の基本文法を学び、次にクラスライブラリやWeb APIに進むと理解しやすいです。
4. C#の項目テンプレートを作成・編集する方法
Visual Studioでは、自分で項目テンプレートを作成できます。よく使うクラスの形が決まっている場合は、テンプレート化すると便利です。
4-1. 既存クラスをテンプレート化する流れ
既存クラスをテンプレート化する基本的な流れは次のとおりです。
1. テンプレートにしたいC#ファイルを作る
2. クラス名や名前空間をテンプレート変数に置き換える
3. .vstemplateファイルを作成する
4. 必要なファイルをzipにまとめる
5. Visual Studioのテンプレートフォルダに配置する
6. Visual Studioから新しい項目として追加する
たとえば、BaseEntityクラスのテンプレートを作れば、毎回同じプロパティを持つクラスを簡単に作成できます。
4-2. .vstemplateファイルの基本構造
Visual Studioのテンプレートでは、.vstemplateファイルにテンプレート情報を記述します。
例は次のとおりです。
XML<VSTemplate Version="3.0.0" Type="Item"
xmlns="http://schemas.microsoft.com/developer/vstemplate/2005">
<TemplateData>
<Name>Base Entity Class</Name>
<Description>共通プロパティを持つEntityクラス</Description>
<ProjectType>CSharp</ProjectType>
<DefaultName>Entity.cs</DefaultName>
</TemplateData>
<TemplateContent>
<ProjectItem ReplaceParameters="true">Entity.cs</ProjectItem>
</TemplateContent>
</VSTemplate>
重要なのは、ProjectItemのReplaceParametersをtrueにすることです。これにより、テンプレート変数が実際の名前に置換されます。
4-3. $safeitemrootname$などのテンプレート変数の使い方
Visual Studioの項目テンプレートでは、特殊な変数を使えます。
よく使う変数は次のとおりです。
$safeitemrootname$ ファイル名から安全なクラス名を生成
$rootnamespace$ プロジェクトのルート名前空間
$guid1$ GUIDを生成
$time$ 現在時刻
$userdomain$ ユーザーのドメイン名
$username$ ユーザー名
たとえば、クラス名に$safeitemrootname$を使うと、ファイル名に応じたクラス名を自動で入れられます。
C#namespace $rootnamespace$;
public class $safeitemrootname$
{
}
「Customer.cs」という名前で追加すると、次のようになります。
C#namespace SampleApp;
public class Customer
{
}
4-4. 名前空間・アクセス修飾子・usingを自動生成する方法
名前空間やusingもテンプレート内にあらかじめ書いておけば、自動生成できます。
C#using System;
namespace $rootnamespace$;
public class $safeitemrootname$
{
public Guid Id { get; set; } = Guid.NewGuid();
public DateTime CreatedAt { get; set; } = DateTime.UtcNow;
}
業務で共通のルールがある場合は、public、internal、abstractなどのアクセス修飾子もテンプレートに含めておくと便利です。
C#namespace $rootnamespace$;
public abstract class $safeitemrootname$
{
public Guid Id { get; protected set; } = Guid.NewGuid();
}
4-5. 作成したテンプレートをVisual Studioに追加する方法
作成した項目テンプレートは、通常zip形式で保存し、Visual Studioのテンプレートフォルダに配置します。
一般的な配置先は次のような場所です。
ドキュメント\Visual Studio 20xx\Templates\ItemTemplates
配置後、Visual Studioを再起動すると、「新しい項目の追加」画面に表示されます。
表示されない場合は、zipの中に.vstemplateファイルが正しく入っているか、TemplateDataのProjectTypeがCSharpになっているか確認してください。
5. dotnet newでC#プロジェクトテンプレートを作成する方法
Visual Studioだけでなく、.NET CLIでもC#テンプレートを作成できます。
5-1. .NET CLIテンプレートとは
.NET CLIテンプレートとは、dotnet newコマンドで使えるテンプレートです。
たとえば、次のコマンドでコンソールアプリを作成できます。
Bashdotnet new console -n SampleApp
カスタムテンプレートを作れば、チーム独自のWeb API構成やクラスライブラリ構成を、コマンド一つで生成できます。
5-2. .template.configとtemplate.jsonの役割
.NET CLIテンプレートでは、テンプレートのルートフォルダに「.template.config」フォルダを作り、その中にtemplate.jsonを配置します。
構成例は次のとおりです。
MyWebApiTemplate/
├─ .template.config/
│ └─ template.json
├─ Controllers/
├─ Services/
├─ Program.cs
└─ MyWebApiTemplate.csproj
template.jsonには、テンプレート名、短縮名、言語、プロジェクトタイプなどを記述します。
JSON{
"$schema": "http://json.schemastore.org/template",
"author": "Your Team",
"classifications": [ "Web", "API" ],
"identity": "Company.Templates.WebApi",
"name": "Company Web API Template",
"shortName": "company-webapi",
"sourceName": "Company.WebApi",
"preferNameDirectory": true
}
sourceNameに指定した文字列は、dotnet new実行時のプロジェクト名に置換されます。
5-3. カスタムテンプレートの基本的な作成手順
.NET CLIテンプレートを作る手順は次のとおりです。
1. 元になるC#プロジェクトを作成する
2. 不要なbin、objフォルダを削除する
3. 汎用化したい名前をsourceNameに合わせる
4. .template.configフォルダを作る
5. template.jsonを作成する
6. dotnet new installでテンプレートをインストールする
7. dotnet newで生成できるか確認する
実行例は次のとおりです。
Bashdotnet new install ./MyWebApiTemplate
dotnet new company-webapi -n Sales.Api
これでSales.Apiという名前のプロジェクトが作成されます。
5-4. テンプレートをインストール・実行・削除するコマンド
よく使うdotnet newテンプレートのコマンドは次のとおりです。
Bashdotnet new list
インストール済みテンプレートを確認します。
Bashdotnet new install ./MyTemplate
ローカルフォルダのテンプレートをインストールします。
Bashdotnet new company-webapi -n Sample.Api
テンプレートからプロジェクトを作成します。
Bashdotnet new uninstall ./MyTemplate
テンプレートを削除します。
テンプレートが見つからない場合は、shortNameが正しいか、インストール先が正しいか確認しましょう。
5-5. チーム開発でテンプレートを共有する方法
チームでC#テンプレートを共有する方法には、次のようなものがあります。
・Gitリポジトリで管理する
・NuGetパッケージ化して配布する
・社内テンプレート用リポジトリを作る
・READMEにインストール手順を書く
・CIでテンプレートのビルド確認を行う
おすすめは、テンプレート自体をGitで管理し、バージョンを付ける方法です。テンプレートを変更した履歴が残るため、トラブルが起きたときに原因を追いやすくなります。
6. C#ジェネリックをテンプレート的に使う方法
C#にはC++のtemplate構文はありませんが、ジェネリックを使うことで、型に依存しない汎用的なコードを書けます。
6-1. ジェネリックとは何か
ジェネリックとは、クラスやメソッドで扱う型を後から指定できる仕組みです。
たとえば、List<T>は代表的なジェネリックです。
C#List<string> names = new();
List<int> numbers = new();
同じListでも、string用、int用のように型を変えて使えます。
6-2. ジェネリッククラスの書き方
ジェネリッククラスは、クラス名の後ろに<T>を付けて定義します。
C#public class Box<T>
{
public T Value { get; set; }
public Box(T value)
{
Value = value;
}
}
使う側では、具体的な型を指定します。
C#var stringBox = new Box<string>("Hello");
var intBox = new Box<int>(100);
Tは型パラメーターです。Tの代わりにTEntity、TKey、TValueなど、意味のある名前を使うこともあります。
6-3. ジェネリックメソッドの書き方
メソッドだけをジェネリックにすることもできます。
C#public static T FirstOrDefaultValue<T>(IEnumerable<T> items)
{
foreach (var item in items)
{
return item;
}
return default!;
}
呼び出し例は次のとおりです。
C#var names = new List<string> { "Alice", "Bob" };
string firstName = FirstOrDefaultValue(names);
型推論が働くため、多くの場合は<T>を明示しなくても使えます。
6-4. where制約の使い方
where制約を使うと、ジェネリックで指定できる型に条件を付けられます。
C#public class Repository<T> where T : class
{
private readonly List<T> _items = new();
public void Add(T item)
{
_items.Add(item);
}
}
よく使うwhere制約は次のとおりです。
C#where T : class
where T : struct
where T : new()
where T : BaseEntity
where T : IEntity
たとえば、new()制約を付けると、Tのインスタンスを生成できます。
C#public T Create<T>() where T : new()
{
return new T();
}
6-5. 型ごとの重複コードを減らす実践例
UserRepository、ProductRepository、OrderRepositoryがほとんど同じ処理を持っている場合、ジェネリックで共通化できます。
C#public interface IEntity
{
Guid Id { get; set; }
}
public class Repository<T> where T : IEntity
{
private readonly List<T> _items = new();
public void Add(T item)
{
_items.Add(item);
}
public T? FindById(Guid id)
{
return _items.FirstOrDefault(x => x.Id == id);
}
public IEnumerable<T> GetAll()
{
return _items;
}
}
使い方は次のとおりです。
C#public class User : IEntity
{
public Guid Id { get; set; }
public string Name { get; set; } = "";
}
var repository = new Repository<User>();
repository.Add(new User { Id = Guid.NewGuid(), Name = "Alice" });
このように、型ごとに似たコードを書かずに済むのがジェネリックの大きなメリットです。
7. T4テキストテンプレートでコードを自動生成する方法
T4テキストテンプレートを使うと、C#コードや設定ファイルを自動生成できます。
7-1. T4テンプレートとは
T4は、Text Template Transformation Toolkitの略です。
Visual Studioで使えるコード生成の仕組みで、.ttファイルからテキストファイルを生成します。生成する内容はC#コードでも、HTMLでも、JSONでも構いません。
大量の似たコードを作る場合や、モデル定義からコードを生成したい場合に役立ちます。
7-2. .ttファイルの基本構文
基本的なT4テンプレートは次のように書きます。
C#<#@ template language="C#" #>
<#@ output extension=".cs" #>
namespace Generated;
public class Sample
{
public string Name { get; set; } = "";
}
この.ttファイルを保存すると、指定した拡張子のファイルが生成されます。
7-3. 変数・if文・ループを使った生成例
T4では、C#のコードブロックを使えます。
C#<#@ template language="C#" #>
<#@ output extension=".cs" #>
<#
var className = "UserDto";
var properties = new[]
{
new { Type = "Guid", Name = "Id" },
new { Type = "string", Name = "Name" },
new { Type = "DateTime", Name = "CreatedAt" }
};
#>
namespace Generated;
public class <#= className #>
{
<# foreach (var property in properties) { #>
public <#= property.Type #> <#= property.Name #> { get; set; }
<# } #>
}
生成されるコードは次のようになります。
C#namespace Generated;
public class UserDto
{
public Guid Id { get; set; }
public string Name { get; set; }
public DateTime CreatedAt { get; set; }
}
7-4. DTOや設定ファイルを自動生成する実践例
たとえば、複数のDTOをまとめて生成したい場合は、T4が便利です。
C#<#@ template language="C#" #>
<#@ output extension=".cs" #>
<#
var entities = new[] { "User", "Product", "Order" };
#>
namespace GeneratedDtos;
<# foreach (var entity in entities) { #>
public class <#= entity #>Dto
{
public Guid Id { get; set; }
public string Name { get; set; } = "";
}
<# } #>
手作業でUserDto、ProductDto、OrderDtoを書くよりも、修正漏れを防ぎやすくなります。
7-5. T4テンプレートを使うときの注意点
T4テンプレートは強力ですが、使いすぎには注意が必要です。
生成元のテンプレートが複雑になりすぎると、かえって保守が難しくなります。また、生成されたコードを直接編集すると、再生成時に上書きされる可能性があります。
T4を使う場合は、次のルールを決めておくと安全です。
・生成コードは手動編集しない
・編集するのは.ttファイルだけにする
・生成コードには自動生成であることをコメントで書く
・複雑なロジックをテンプレートに詰め込みすぎない
・テンプレート変更後は必ずビルド確認する
8. C#テンプレートの実践例
ここからは、実際に使えるC#テンプレートの例を紹介します。
8-1. 共通プロパティを持つクラスを自動生成する例
EntityクラスにId、CreatedAt、UpdatedAtを持たせたい場合のテンプレート例です。
C#namespace $rootnamespace$;
public class $safeitemrootname$
{
public Guid Id { get; set; } = Guid.NewGuid();
public DateTime CreatedAt { get; set; } = DateTime.UtcNow;
public DateTime UpdatedAt { get; set; } = DateTime.UtcNow;
}
Customer.csとして追加すると、Customerクラスが自動生成されます。
C#namespace SampleApp;
public class Customer
{
public Guid Id { get; set; } = Guid.NewGuid();
public DateTime CreatedAt { get; set; } = DateTime.UtcNow;
public DateTime UpdatedAt { get; set; } = DateTime.UtcNow;
}
8-2. Repositoryクラスのひな形を作る例
Repositoryクラスのテンプレート例です。
C#namespace $rootnamespace$;
public class $safeitemrootname$<T> where T : class
{
private readonly List<T> _items = new();
public void Add(T item)
{
_items.Add(item);
}
public IEnumerable<T> GetAll()
{
return _items;
}
public void Remove(T item)
{
_items.Remove(item);
}
}
実際の業務では、Entity Framework CoreのDbContextを受け取る形にしてもよいでしょう。
C#namespace $rootnamespace$;
public class $safeitemrootname$<T> where T : class
{
private readonly AppDbContext _context;
public $safeitemrootname$(AppDbContext context)
{
_context = context;
}
public IQueryable<T> Query()
{
return _context.Set<T>();
}
public void Add(T entity)
{
_context.Set<T>().Add(entity);
}
}
8-3. Web APIプロジェクトのテンプレートを作る例
Web APIプロジェクトでは、次のような構成をテンプレート化すると便利です。
Controllers/
Services/
Repositories/
Dtos/
Models/
Program.cs
appsettings.json
template.jsonの例です。
JSON{
"$schema": "http://json.schemastore.org/template",
"author": "Company",
"classifications": [ "Web", "API", "C#" ],
"identity": "Company.WebApi.Template",
"name": "Company Web API Template",
"shortName": "company-webapi",
"sourceName": "Company.WebApi",
"preferNameDirectory": true
}
作成コマンドは次のとおりです。
Bashdotnet new install ./Company.WebApi.Template
dotnet new company-webapi -n Inventory.Api
これにより、社内標準の構成を持つWeb APIプロジェクトをすぐに作成できます。
8-4. Unity用C#スクリプトテンプレートを作る例
Unity開発でもC#スクリプトのテンプレートを整えると便利です。
C#using UnityEngine;
public class #SCRIPTNAME# : MonoBehaviour
{
private void Awake()
{
}
private void Start()
{
}
private void Update()
{
}
}
Unityではスクリプト名とクラス名が一致している必要があります。テンプレートを編集する場合は、クラス名の置換ルールを壊さないように注意しましょう。
8-5. テストコードのテンプレートを作る例
xUnitのテストクラスをテンプレート化する例です。
C#using Xunit;
namespace $rootnamespace$;
public class $safeitemrootname$
{
[Fact]
public void TestName_Should_ExpectedResult()
{
// Arrange
// Act
// Assert
}
}
Arrange、Act、Assertの形を最初から入れておくと、チーム内でテストコードの書き方を統一できます。
9. C#テンプレート作成でよくあるエラーと解決方法
C#テンプレートを作成していると、表示されない、置換されない、生成後にコンパイルエラーになるといった問題が起こることがあります。
9-1. テンプレートがVisual Studioに表示されない
Visual Studioにテンプレートが表示されない場合は、次を確認してください。
・zipファイルの直下に.vstemplateがあるか
・TemplateDataのProjectTypeがCSharpになっているか
・ItemTemplatesフォルダに配置しているか
・Visual Studioを再起動したか
・対象のプロジェクト種類に対応しているか
zipの中にフォルダが一段余分に入っていると、Visual Studioがテンプレートを認識できないことがあります。
9-2. 名前空間やクラス名が正しく置換されない
テンプレート変数がそのまま出力される場合は、.vstemplateのProjectItemにReplaceParameters="true"が指定されているか確認します。
XML<ProjectItem ReplaceParameters="true">Class1.cs</ProjectItem>
また、$safeitemrootname$のスペルミスにも注意してください。
誤りの例です。
C#public class $safeitemrootName$
{
}
正しくは次のように書きます。
C#public class $safeitemrootname$
{
}
9-3. dotnet newでテンプレートが見つからない
dotnet newでテンプレートが見つからない場合は、次を確認します。
Bashdotnet new list
一覧に表示されない場合は、インストールに失敗している可能性があります。
Bashdotnet new install ./MyTemplate
template.jsonのshortNameを間違えている場合もあります。
JSON"shortName": "company-webapi"
この場合、実行コマンドは次のようになります。
Bashdotnet new company-webapi -n Sample.Api
9-4. template.jsonの設定ミス
template.jsonでよくあるミスは次のとおりです。
・JSONのカンマ漏れ
・shortNameの重複
・sourceNameの指定ミス
・identityが他テンプレートと重複
・.template.configの場所が違う
最小構成から始めて、少しずつ設定を追加するのがおすすめです。
JSON{
"$schema": "http://json.schemastore.org/template",
"author": "Your Name",
"classifications": [ "Console" ],
"identity": "Sample.Console.Template",
"name": "Sample Console Template",
"shortName": "sample-console",
"sourceName": "Sample.Console"
}
9-5. 生成されたコードがコンパイルエラーになる
テンプレートから生成されたコードがコンパイルエラーになる場合は、テンプレート自体を通常のC#プロジェクトとしてビルドできる状態にしておくことが重要です。
確認ポイントは次のとおりです。
・usingが不足していないか
・名前空間が正しいか
・クラス名とファイル名がずれていないか
・必要なNuGetパッケージが含まれているか
・置換後の名前がC#の識別子として有効か
テンプレートは「生成して終わり」ではなく、「生成後にビルドできること」まで確認しましょう。
10. C#テンプレートを使うときのベストプラクティス
C#テンプレートを効果的に使うには、作り方だけでなく運用ルールも重要です。
10-1. テンプレート化すべきコード・すべきでないコード
テンプレート化すべきコードは、繰り返し使う定型的なコードです。
・Entityクラス
・DTO
・Repository
・Service
・Controller
・テストクラス
・プロジェクト初期構成
一方、業務ロジックのように毎回内容が大きく変わるコードは、無理にテンプレート化しないほうがよいです。
テンプレート化に向いているのは、「構造は同じで名前や一部の値だけが違うコード」です。
10-2. 保守しやすいテンプレート設計のコツ
保守しやすいテンプレートにするには、シンプルに作ることが大切です。
・最初から複雑にしすぎない
・不要なコードを入れない
・コメントで意図を残す
・生成後にすぐビルドできる状態にする
・テンプレートの責務を分ける
テンプレートに何でも詰め込むと、使わないコードが増えます。最小限のひな形にして、必要な部分だけ追加できる形が理想です。
10-3. 命名規則とフォルダ構成を統一する方法
テンプレートを使う大きなメリットは、命名規則とフォルダ構成を統一できることです。
たとえば、Web APIで次のような構成を標準化できます。
Controllers/
Application/Services/
Domain/Entities/
Infrastructure/Repositories/
Contracts/Requests/
Contracts/Responses/
Tests/
命名規則もテンプレートに含めておくと便利です。
UserController
UserService
UserRepository
UserRequest
UserResponse
UserTests
チーム開発では、テンプレートを使うことで「人によってフォルダ構成が違う」という問題を減らせます。
10-4. チームでテンプレートを運用するポイント
チームでテンプレートを運用する場合は、次のルールを決めておきましょう。
・テンプレートの管理場所
・変更時のレビュー方法
・バージョン管理の方法
・古いテンプレートの廃止ルール
・READMEの整備
・利用コマンドの統一
テンプレートも通常のコードと同じく、レビュー対象にするべきです。テンプレートの品質が低いと、品質の低いコードが大量に生成されてしまいます。
10-5. テンプレートとスニペットの使い分け
テンプレートと似たものにコードスニペットがあります。
スニペットは、コードの一部を素早く挿入するためのものです。
C#prop
Visual Studioでpropと入力してTabキーを押すと、プロパティのひな形を挿入できます。
一方、テンプレートはファイルやプロジェクト全体を生成するためのものです。
スニペット:メソッド、プロパティ、if文などの小さなコード
テンプレート:クラス、DTO、Repository、プロジェクトなどの大きな単位
小さな定型コードはスニペット、ファイル単位やプロジェクト単位はテンプレートと考えると使い分けやすいです。
11. C#テンプレートに関するよくある質問
最後に、C#テンプレートに関するよくある質問に答えます。
11-1. C#にC++のようなtemplateはある?
C#にはC++と同じtemplate構文はありません。
C#で型に依存しないコードを書きたい場合は、ジェネリックを使います。
C#public class Box<T>
{
public T Value { get; set; }
}
C++のtemplateとC#のジェネリックは似た目的で使われることがありますが、仕組みは異なります。
11-2. C#テンプレートとジェネリックは同じ?
同じではありません。
C#テンプレートは、コードやプロジェクトを生成するひな形を指すことが多いです。
一方、ジェネリックは、型をパラメーター化して再利用可能なコードを書くためのC#の言語機能です。
C#テンプレート:コードやファイルを生成する仕組み
ジェネリック:型を汎用化する言語機能
ただし、初心者向けには「ジェネリックはC#でテンプレート的に使える仕組み」と説明されることもあります。
11-3. Visual Studioなしでもテンプレートは作れる?
作れます。
.NET CLIのdotnet newテンプレートを使えば、Visual StudioなしでもC#テンプレートを作成できます。
Bashdotnet new install ./MyTemplate
dotnet new mytemplate -n SampleApp
Visual Studio Codeやコマンドライン中心の開発でも利用できます。
11-4. 初心者はどのテンプレートから覚えるべき?
初心者は、次の順番で覚えるのがおすすめです。
1. Visual Studioのプロジェクトテンプレート
2. Visual Studioの項目テンプレート
3. クラステンプレート
4. ジェネリック
5. dotnet newテンプレート
6. T4テンプレート
最初からT4やカスタムテンプレートに進むより、まずは標準テンプレートを使いこなすことが大切です。
11-5. 業務開発でC#テンプレートは使うべき?
同じ構成のコードを何度も作るなら、C#テンプレートは積極的に使うべきです。
特に、Web API、Repository、Service、DTO、テストコードなどはテンプレート化の効果が高いです。
ただし、テンプレートを作ること自体が目的にならないように注意しましょう。頻繁に使うもの、チームで統一したいもの、ミスを減らしたいものからテンプレート化するのがおすすめです。
まとめ
C#テンプレートは、C#開発を効率化するための強力な仕組みです。
Visual Studioのプロジェクトテンプレートや項目テンプレートを使えば、初心者でも簡単にプロジェクトやクラスを作成できます。さらに、.vstemplateを使った項目テンプレート、dotnet newによるプロジェクトテンプレート、T4テキストテンプレートを活用すれば、業務やチームに合わせたコード生成も可能です。
また、C#にはC++のtemplate構文はありませんが、ジェネリックを使うことで型に依存しない再利用可能なコードを書けます。
C#テンプレートを使いこなすポイントは、繰り返し使う定型コードを見極め、シンプルで保守しやすい形にすることです。テンプレートを適切に活用すれば、開発スピードを上げながら、コード品質やチーム内の統一感も高められます。

