質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

1回答

1428閲覧

項目テンプレートでファイル名($safeitemname$)を大文字にする方法

ry188472

総合スコア74

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

1グッド

0クリップ

投稿2021/08/16 08:32

編集2021/08/17 01:55

Visual StudioでC#のソースコードのテンプレートを作っています。
予約済みのテンプレートパラメーターより、$itemname$ や $safeitemname$ を使えばファイル名をソースコードに使用できることがわかっています。
実際には、ソースコードではファイル名に指定された文字列を大文字に変換した文字列を使用したいのですが、そういった変換はVisual Studio 2019で可能でしょうか?

cs

1// テンプレート内のソース 2public class $upperitemname$ 3{ 4 public const string Name = "$itemname$"; 5}

↓ 例:ファイル名に「abc.cs」と設定した場合 ↓

cs

1public class ABC 2{ 3 public const string Name = "abc"; 4}

備考

同様の質問では「できない」という回答がありましたが、VS2019でできるようになってたらいいなあという気持ちもあり質問しています。

stackoverflow - Uppercase Visual Studio itemTemplate Parameters

Creating Visual Studio item templates

TN8001👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

実際には、ソースコードではファイル名に指定された文字列を大文字に変換した文字列を使用したいのですが、そういった変換はVisual Studio 2019で可能でしょうか?

私は下記拡張機能を入れてツールバーに登録しています。
マウスクリックでSCREAMING_SNAKE_CASEにはできます(ほかにも同様のものがあるかもしれません)
Case Converter - Visual Studio Marketplace

これではダメでしょうか?
というのもできたはできたのですが、非常に面倒だったためです^^;
作り方は参考記事に詳しく書かれていますので、面倒なだけで難しくはないです。
一度作ってしまえば何百回でも使えるわけで、どうするかはry188472さん次第です。

同様の質問では「できない」という回答がありましたが、VS2019でできるようになってたらいいなあという気持ちもあり質問しています。

c++ - Uppercase Visual Studio itemTemplate Parameters - Stack Overflow

質問者自身が言及している別スレッドには、回答がついています(質問当時は回答がなかったようですが)
Uppercase Visual Studio 2013 project template $itemname$ - Stack Overflow

コードの断片なのでどういうことかわかりにくいですが、「カスタム テンプレート ウィザード」を作れと言っています。

方法 : プロジェクト テンプレートを組み合わせたウィザードを使用する - Visual Studio (Windows) | Microsoft Docs

VisualStudioで項目テンプレートを作成する+プロジェクトのプロパティを使う - Qiita

Qiita記事で1点気になったのは、NuGetからVSSDK.TemplateWizardInterfaceを入れるようにという点です(上げているのは中の人っぽいので、そこまで警戒しなくてもいいかもしれませんが)
Visual Studio SDKを入れていれば、そもそも入っているはずです(上記Docsに参照の入れ方が書いてあります)
入れるにしても公式があるようなので、こちらがいいでしょう。
NuGet Gallery | Microsoft.VisualStudio.TemplateWizardInterface 16.10.31320.204

cs

1using EnvDTE; 2using Microsoft.VisualStudio.TemplateWizard; 3using System.Collections.Generic; 4 5namespace VSIXProject1 6{ 7 public class Class1 : IWizard 8 { 9 public void BeforeOpeningFile(ProjectItem projectItem) { } 10 public void ProjectFinishedGenerating(Project project) { } 11 public void ProjectItemFinishedGenerating(ProjectItem projectItem) { } 12 public void RunFinished() { } 13 public void RunStarted(object automationObject, Dictionary<string, string> replacementsDictionary, WizardRunKind runKind, object[] customParams) 14 { 15 replacementsDictionary.Add("$uppersafeitemname$", replacementsDictionary["$safeitemname$"].ToUpper(CultureInfo.InvariantCulture)); 16 } 17 public bool ShouldAddProjectItem(string filePath) => true; 18 } 19}

テンプレート

cs

1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Text; 5using System.Threading.Tasks; 6 7 8namespace $rootnamespace$ 9{ 10 public class $uppersafeitemname$ 11 { 12 public const string Name = "$itemname$"; 13 } 14}

出力

cs:abc.cs

1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Text; 5using System.Threading.Tasks; 6 7 8namespace ConsoleApp1 9{ 10 public class ABC 11 { 12 public const string Name = "abc"; 13 } 14}

なぜかreplacementsDictionary$itemname$がいなかったので、$safeitemname$を使用しました。

投稿2021/08/18 11:25

編集2023/08/14 12:52
TN8001

総合スコア9401

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ry188472

2021/08/19 05:11 編集

ご回答ありがとうございました。 実はそのstackoverflowのリンクの「カスタムテンプレートウィザードを作る」というのにはたどり着いていましたが、項目テンプレートで生成する一箇所だけだったためにそこまでやるか迷ってました。 やはりその方法しかないようですね。サンプルコードの提示もありがとうございます。 なお、より具体的な話をさせていただくと、今回やりたかったのが以下になります。 ①C#9のSourceGeneratorを使って、特定の属性をつけるとソースを自動生成 ②自動生成する部分はT4 Templateを活用、必要な内容はSourceGeneratorからコード解析して構造体にまとめて渡す ③上2つでボイラープレートをある程度自動生成できたが、ファイル名が決まった時点でボイラープレートをすべて展開できることがわかったので、項目テンプレートからファイルを追加するときにファイル名を使ってSourceGenerator対象の属性をつけたソースコードを自動生成 今回の目的では大文字に変えたい部分が1箇所だけだったので、ウィザード作成まではやらずに②のときに大文字変換したものをT4 Templateで使えば同じことができるため、その方法でやろうと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問