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

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

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

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

Q&A

解決済

2回答

2394閲覧

T4テキストテンプレートファイルでコンパイルエラー

ud_fibonacci

総合スコア25

C#

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

0グッド

0クリップ

投稿2018/01/19 01:41

編集2018/01/19 03:40

###前提・実現したいこと
WPFやMVVMについて勉強中です。
T4テキストテンプレートファイルに下記のソースコードを書いたところ、★のところで下記のようなエラーが出ます。
本のサンプルを写しているのですが、どこか間違いがあるのでしょうか?

なお、Data型や、List<Data> _dataは別で宣言しています。
宜しくお願いします。

###発生している問題・エラーメッセージ

変換をコンパイルしています:現在のコンテキストに 'x' という名前は存在しません。

###該当のソースコード

private void SetProperties(CustomoerViewModel source) { if (source == null) return; <# foreach(Data x in _data) #> <# { #> <#= x.Name #> = source.<#= x.Name #>; // ← ★この行でエラー <# } #> PostCode = source.PostCode; }

###最終的に作成したいソースコード(該当部分)

private void SetProperties(CustomoerViewModel source) { if (source == null) return; Name = source.Name; PostCode = source.PostCode; }

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

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

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

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

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

Zuishin

2018/01/19 03:36

最終的にどのようなソースが生成されればいいのか書いてください。
ud_fibonacci

2018/01/19 03:41

お問い合わせありがとうございます!質問を編集して、最終的に作成したいソースを記入しましたが、これで宜しいでしょうか?ファイル全体が宜しいですか?
guest

回答2

0

ベストアンサー

テンプレートと cs のデータ型が混ざっているようです。
たとえば次のようになります。

TextTemplate1.tt

C#

1<#@ template debug="false" hostspecific="false" language="C#" #> 2<#@ assembly name="System.Core" #> 3<#@ import namespace="System.Linq" #> 4<#@ import namespace="System.Text" #> 5<#@ import namespace="System.Collections.Generic" #> 6<#@ output extension=".cs" #> 7 8<# var _data = new string[] { "Alpha", "Bravo", "Charley" }; #> 9 10using System; 11using System.Collections.Generic; 12using System.IO; 13using System.Linq; 14 15namespace WindowsFormsApp1 16{ 17 public class Class1 18 { 19 public string PostCode { get; set; } 20 21 private void SetProperties(CustomerViewModel source) 22 { 23 if (source == null) return; 24<# foreach (string x in _data) { #> 25 <#= x#> = source.<#= x#>; 26<# } #> 27 PostCode = source.PostCode; 28 } 29 } 30 31 public class CustomerViewModel 32 { 33 public string PostCode { get; set; } 34 } 35 36 public class Data 37 { 38 public Data(string name) 39 { 40 Name = name; 41 } 42 43 public string Name { get; set; } 44 } 45}

TextTemplate1.cs

C#

1 2 3using System; 4using System.Collections.Generic; 5using System.IO; 6using System.Linq; 7 8namespace WindowsFormsApp1 9{ 10 public class Class1 11 { 12 public string PostCode { get; set; } 13 14 private void SetProperties(CustomerViewModel source) 15 { 16 if (source == null) return; 17 Alpha = source.Alpha; 18 Bravo = source.Bravo; 19 Charley = source.Charley; 20 PostCode = source.PostCode; 21 } 22 } 23 24 public class CustomerViewModel 25 { 26 public string PostCode { get; set; } 27 } 28 29 public class Data 30 { 31 public Data(string name) 32 { 33 Name = name; 34 } 35 36 public string Name { get; set; } 37 } 38}

投稿2018/01/19 03:44

Zuishin

総合スコア28656

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

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

Zuishin

2018/01/19 03:56

要するに、_data を実行時に決めていたのでは、ソース生成時には _data がありません。 別のプロジェクトとしてアセンブリを作り、 <#@ assembly name= を使って読み込む必要があります。
ud_fibonacci

2018/01/19 06:37

ありがとうございます! _dataは、一応宣言?していたのですが… 難しくてまだよく理解できていないところもありますが、Zuishinさんの書いてくださったソースを見て、2行に分けて書いていたブロック?を1行に纏めたら、csファイルが生成されるようになりました! ただ、まだエラーがあるので、教えていただいたことの理解に勤めつつ、修正していきます。 取り急ぎ途中経過の報告で申し訳ありません。 ありがとうございました! //----------------------------- // Before //----------------------------- <# foreach (string x in _data) #> <# { #> //----------------------------- // アフター //----------------------------- <# foreach (string x in _data) { #>
Zuishin

2018/01/19 06:39

もう一つ回答を作っています。 そっちを確かめてみてください。
Zuishin

2018/01/19 06:42

もしかすると、アセンブリを分けて生成時に読み込んでいないのではありませんか? <# assembly name=... #> を確認してみてください。
guest

0

もう一つの回答が外してるかもしれないので Data を生かして別解を。

まず前提としてプロジェクトは二つあります。
ソリューションのディレクトリを仮に C:\Solution とすると
C:\Solution\WindowsFormsApp1 に Windows Forms アプリである WindowsFormsApp1.exe を作るプロジェクト
C:\Solution\ClassLibrary1 にクラスライブラリである ClassLibrary1.dll を作るプロジェクト

ClassLibrary には次のソースが含まれています。

Data.cs

C#

1namespace ClassLibrary1 2{ 3 public class Data 4 { 5 public Data(string name) 6 { 7 Name = name; 8 } 9 10 public string Name { get; set; } 11 } 12}

WindowsFormsApp1 には次のソースが含まれています。

TextTemplate1.tt

C#

1<#@ template debug="false" hostspecific="false" language="C#" #> 2<#@ assembly name="System.Core" #> 3<#@ assembly name="$(SolutionDir)\ClassLibrary1\bin\Debug\ClassLibrary1.dll" #> 4<#@ import namespace="System.Linq" #> 5<#@ import namespace="System.Text" #> 6<#@ import namespace="System.Collections.Generic" #> 7<#@ import namespace="ClassLibrary1" #> 8<#@ output extension=".cs" #> 9 10<# var _data = new List<Data>() { new Data("Alpha"), new Data("Bravo"), new Data("Charley") }; #> 11 12using System; 13using ClassLibarry1; 14 15namespace WindowsFormsApp1 16{ 17 public class Class1 18 { 19 private void SetProperties(CustomoerViewModel source) 20 { 21 if (source == null) return; 22<# foreach(Data x in _data) #> 23<# { #> 24 <#= x.Name #> = source.<#= x.Name #>; 25<# } #> 26 PostCode = source.PostCode; 27 } 28 } 29}

この状態で TextTemplate1.tt を保存すると、次のソースが作られます。

C#

1using System; 2using ClassLibarry1; 3 4namespace WindowsFormsApp1 5{ 6 public class Class1 7 { 8 private void SetProperties(CustomoerViewModel source) 9 { 10 if (source == null) return; 11 Alpha = source.Alpha; 12 Bravo = source.Bravo; 13 Charley = source.Charley; 14 PostCode = source.PostCode; 15 } 16 } 17}

これでどうでしょうか?

投稿2018/01/19 06:40

Zuishin

総合スコア28656

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

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

ud_fibonacci

2018/01/19 07:01

別解答まで作成していただきありがとうございます!!! csファイルのクラスをアセンブリで読み込んで使えるということがすごく良く分かりました! また、先ほど無事ttファイルからcsファイルを作成することができました。 直接的な原因はやはり、先ほどお伝えした、foreachブロックの『{』の位置の様でしたが、 Zuishin様に教えて頂き解決できたことで なぜテキストテンプレートファイルを使うのか?(どんな恩恵があるのか?)という初歩的な疑問も解決できました! お忙しい中丁寧に教えて頂きありがとうございました! もう少し理解が進んだら、またご回答を読み返して振り返りたいと思います。 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問