2016-09-05 30 views
0

列挙型の値に基づいて同様のクラスの束を生成したいと思います。これらのクラスは密接に関連していますが、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クラスジェネレータで匿名タイプを使用する方法を理解するのを助けることができれば、非常に助かります。それでは、事前に感謝します!

答えて

0

私は最終的には、明示的にC#4.0は、メタプログラミングのために使用されるべきであることを指定することで、この作業を得た:

<# // Specify the C# version being used is 4.0 #> 
<#@ Assembly Name="System.Core, Version=4.0.0.0, Culture=neutral" #> 
<#@ Assembly Name="Microsoft.CSharp, Version=4.0.0.0, Culture=neutral" #> 

<#@ template debug="false" hostspecific="false" language="C#" #> 
<#@ output extension=".cs" #> 
<# 
    var enum_nvs = new dynamic[] { 
     new { EnumName = "HoverDatePicker.Mode", EnumValue = "View"}, 
     new { EnumName = "HoverDatePicker.Mode", EnumValue = "Edit"}, 
     new { EnumName = "Frequency",    EnumValue = "Monthly"}, 
     new { EnumName = "Frequency",    EnumValue = "Weekly"} 
    }; 
#> 
<# 
for(int i = 0; i < enum_values.Length; i++) 
{ #> 
    public class <#= enum_values[i].Value #>VisibilityConverter : IValueConverter 
    { 
    } 
<# 
} #> 
関連する問題