ソーステンプレート
従来、テンプレートまたはスニペットは、ソースコードの外部で保存および管理されていました。 通常、テンプレートは汎用定型コードをすばやく作成するのに役立つため、これは理にかなっています。 これらの目的のために、ReSharper は多くの事前定義された ライブテンプレート、 サラウンドテンプレート、 ファイルテンプレートを提供します。 これらのタイプの 独自のテンプレートを作成することもできます。
ただし、現在のプロジェクトまたはソリューションにのみ関連する繰り返し可能なコードを生成したい場合があります。 ReSharper では、 ソーステンプレートを使ってこうしたタスクの効率化が可能です。
仕組み
従来のテンプレートとは対照的に、ソーステンプレートは、 拡張メソッドとしてプロジェクトのコードのどこにでも作成できます。 プロジェクトの特定のタイプまたは標準タイプに対して定義できます。 object の拡張メソッドとして作成することにより、すべてのタイプでソーステンプレートを使用できるようにすることもできます。
テンプレートが定義されるとすぐに、対応する型のオブジェクトとその継承のために コード補完リストで利用可能になります。 リストでテンプレートを選択すると、ReSharper はテンプレートメソッドの本体からコードをあなたのコードに挿入します。
以下は、ソーステンプレートの最も簡単なアプリケーション例です。 私たちのテンプレート forEach はすべてのジェネリックコレクションで利用可能です。これはパラメーター this IEnumerable<T> x で定義されています。 メソッドの本体で指定されたとおり、コレクションを反復処理するコードが挿入されます。 テンプレートはプロジェクト内のどの静的クラスにも定義できます。 ReSharper は [SourceTemplate] 属性によってテンプレートとして認識されます:
このテンプレートをデプロイするには、任意のコレクションオブジェクトで 自動補完を利用できます:

テンプレート項目を選択すると、オブジェクトはテンプレートテキストに置き換えられます。
テンプレート定義の //$ $END$ コメントは、テンプレートが適用された後のキャレット位置を定義する定義 済みのテンプレートパラメーターにすぎないことに注意してください。 テンプレートの 他のパラメーターを使用して、テンプレートをより柔軟にすることができます。
ソーステンプレートを使用する理由
上記のように、ソーステンプレートは、現在のプロジェクトまたはソリューションで再利用するコードブロックに最も役立ちます。 従来のテンプレートに比べて、ソーステンプレートの利点を示すいくつかの点があります。
ソーステンプレートを扱う際、どこかに切り替える必要はありません。すべてエディター内で完結します。
テンプレートは厳密に型指定されているため、関連するオブジェクトに対してのみ呼び出すことができます。
テンプレート定義がコンパイルされている限り、テンプレートコードにエラーがないことを確認できます。
ソーステンプレートの作成や編集時には、お気に入りの ReSharper 機能として コードインスペクション、 ナビゲーション機能、 コード補完なども自由に利用できます。
ソーステンプレートを作成する
ソーステンプレートの定義については、新しいクラスを作成するか、拡張メソッドを保持する既存の静的クラスを使用できます。
テンプレートメソッドとその本体
ソーステンプレートはパブリック拡張メソッドであり、 [SourceTemplate] 属性を持っている必要があります。 この属性は、 [NotNull]、 [CanBeNull] 、その他の コードアノテーション属性とともに、 JetBrains.Annotations 名前空間で定義されます。 ソーステンプレートメソッドを定義するには、 プロジェクトでコードアノテーションを有効にする必要があります。
テンプレート本体では、好きなことをするコードを書くことができます。 通常は、呼び出し元オブジェクトで何かを行いますが、必ずしもそうする必要はありません。
また、テンプレートメソッドでコンパイルされないコードを使用する必要があります。 例: ローカル変数の名前を生成するために呼び出し側オブジェクト名を使用することができます。 この場合、このコードを '$' 記号で始まる行またはブロックコメントの中に配置します。
ターゲット式
ソーステンプレートが複雑な式を展開すると、デフォルトでは最新の部分のみがキャプチャーされます。 式全体をキャプチャーする必要がある場合は、 Target プロパティと SourceTemplateTargetExpression.Outer 値を使用してこれを明示的に指定する必要があります。 以下の例では、 Sqrt テンプレートが x+y 式全体に展開され、 var sqrt = Math.Sqrt(x+y) になります。

パラメーターとマクロ
ソーステンプレートでは、 パラメーターと マクロを使用できます。 パラメーターに使用するマクロに応じて、パラメーターを指定および使用するいくつかの方法から選択できます。
テンプレートメソッドに新しいパラメーターを追加することで、テンプレートパラメーターを作成できます。 デフォルトでは、それは編集可能なパラメーターとして動作し、テンプレート適用時に ホットスポットセッション中にフォーカスされます。 このパラメーター用にマクロを定義したい場合は、以下の例のように
[Macro]属性を追加する必要があります。属性の
Expressionプロパティは、使用するマクロを定義します。 使用可能なテンプレートマクロの 1 つを指定できます。Editableプロパティでは、テンプレート適用時にパラメーターを編集できるかどうかを任意で指定できます。 デフォルトで、すべてのユーザー定義パラメーターは編集可能です。値-1にするとそのパラメーターは編集不可となります。同じパラメーターがテンプレート内で複数回使われている場合、テンプレート適用時に編集できるのは一箇所だけで、他の箇所は同期的に変更されます。 必要に応じて、『Editable』プロパティにゼロ始まりのインデックスを指定して、どの出現箇所を編集可能にするか定義できます。
[SourceTemplate] public static void newGuid(this object obj, [Macro(Expression = "guid()", Editable = -1)] string newguid) { Console.WriteLine(newguid); }テンプレートメソッドのローカル変数をテンプレートパラメーターに変換できます。 これを行うには、
[Macro]属性をテンプレートメソッド定義に追加し、Targetプロパティで変数名を指定する必要があります。 たとえば、次のようになります。[SourceTemplate] [Macro(Target = "item", Expression = "suggestVariableName()")] public static void forEach<T>(this IEnumerable<T> collection) { foreach (var item in collection) { //$ $END$ } }事前定義パラメーターおよびすべてのユーザー定義パラメーターを、他の ReSharper テンプレートと同様に使用でき、パラメーター識別子を
$記号$param_name$で折り返します。文字列リテラル内にユーザ定義のテンプレートパラメーターを使用することができます(例:
Console.WriteLine("A random GUID: $newguid$");テンプレートパラメーターを文字列リテラル外で使う場合は、
$記号で始まる特別なテンプレートコメント//$ $param_name$に記述する必要があります。 または/*$ $param_name$ */。 たとえば、次のようになります。[SourceTemplate] [Macro(Target = "newguid", Expression = "guid()", Editable = -1)] public static void newGuid(this object obj) { //$ var guid = "$newguid$"; Console.WriteLine("A random GUID: $newguid$"); }呼び出し元オブジェクト、およびメソッドパラメーターとローカル変数として作成されたテンプレートパラメーターは、特別なテンプレートコメント内の
$記号の有無にかかわらず使用できます。
ソーステンプレートを適用する
ソーステンプレートを適用するには、まずテンプレートがスコープ内にあることを確認してください。 つまり、同じ名前空間にいるか、テンプレートの名前空間が明示的にインポートされています。
ソーステンプレートからコードフラグメントを作成する
テンプレートをデプロイする場所にキャレットを置きます。
テンプレートをデプロイするオブジェクトを入力し、ドットを入力して、テンプレートの名前またはその キャメルハンプ省略形の入力を開始します。
補完リストでテンプレートを選択し、クリックするか Enter を押します。
呼び出し元オブジェクト、ドット、入力したテンプレート名の一部は、テンプレート本体に置き換えられます。
テンプレートに 編集可能なパラメーター (つまりユーザー入力が必要)がある場合、ReSharper はエディターで ホットスポットセッションを展開し、最初のパラメーターの入力位置を設定します。 次に下記のことを実行できます。
ReSharper が現在のパラメーターに値を提案している場合、 アップ および ダウン の方向キーで推奨値のリストを移動するか、希望の値を直接入力してください。
タブ または Enter を押して値を確定し、次のパラメーターの入力位置に移動します。 これが最後のパラメーターである場合、ホットスポットセッションは完了し、キャレットはセッション用に定義された終了位置に移動します。
Shift+Tab を押すと、前のパラメーターの入力位置に入力フォーカスが移動します。
Esc を押してホットスポットセッションを終了します。 この場合、すべてのセッションパラメーターはデフォルト値で初期化されます。
この機能は、次の言語とテクノロジーで サポートされています。