列挙型の値に基づいて同様のクラスの束を生成したいと思います。これらのクラスは密接に関連していますが、C#の型安全性のために、この問題を解決するために継承を使用することは実際には実現可能ではありません。したがって、T4を使用することが好ましい。私の場合は、私のメタプログラミングコードで匿名の型を使用したいと思います。これはexample.tt
という名前のファイルに保存されT4での匿名型の使用クラス生成のテンプレート
using System;
using System.Windows.Data;
using System.Globalization;
using System.Windows;
using Fin4.Controls.Core;
<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ output extension=".cs" #>
<#
var enum_values = new dynamic[] {
new { EnumName = "HoverDatePicker.Mode", Value = "View"},
new { EnumName = "HoverDatePicker.Mode", Value = "Mode"},
new { EnumName = "Frequency", Value = "Monthly"},
new { EnumName = "Frequency", Value = "Weekly"}
};
#>
<#
for(int i = 0; i < enum_values.Length; i++)
{ #>
public class <#= enum_values[i].Value #>VisibilityConverter : IValueConverter
{
}
<#
} #>
:ここ
も、私はに実行しています問題を例示している方法で、私の使用パターンを説明する目的のための最小限の抜粋です。このファイルに対して選択されたカスタムツールはTextTemplatingFileGenerator
です。 I(への試みは)私の解決策をコンパイルすると、次の出力が生成されます。
ErrorGeneratingOutput
次のエラーも生成されます。この問題を解決するために私の最初の試みはMicrosoft.CSharp
への参照を追加した
Severity Code Description Project File Line Suppression State
Error CS0116 A namespace cannot directly contain members such as fields or methods Fin4 x:\code\project\project\Controls\example.cs 1 Active
Error CS0103 The name 'ErrorGeneratingOutput' does not exist in the current context. Fin4 x:\code\project\project\Controls\example.cs 1 Active
Error Compiling transformation: Missing compiler required member 'Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create' Fin4 X:\code\project\project\Controls\example.tt 25
。次のDLLへの私の基準点:
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.2\Microsoft.CSharp.dll
これで問題が解決しませんでした。問題を解決する2番目の試みは、カスタムツールの設定をTextTemplatingFilePreprocessor
に変更することでした。これは、私が欲しいものとはまったく異なる何かをするように見えるファイルを生成したので、これで問題は解決されませんでした。
TextTemplatingFileGenerator
ツールがC#.NET 4.0の匿名の型指定機能を使用できなくなっていることが明らかなようです。しかし、私はそれを可能にする方法が不明です。私はグーグルで多くのことをしており、誰もこの問題を抱えていないようです。
誰かがT4クラスジェネレータで匿名タイプを使用する方法を理解するのを助けることができれば、非常に助かります。それでは、事前に感謝します!