2016-09-05 1 views
0

Ich möchte eine Reihe ähnlicher Klassen basierend auf Enum-Werten generieren. Diese Klassen werden in der Struktur eng verwandt sein, aber aufgrund der Typsicherheit von C# ist es nicht wirklich möglich, Vererbung zu verwenden, um dieses Problem zu lösen. Es ist daher vorzuziehen, T4 zu verwenden. In meinem Fall möchte ich anonyme Typen in meinem Metaprogrammierungscode verwenden.Verwenden von anonymen Typen mit T4-Vorlagen für die Klassengenerierung

Hier ist ein minimal-Schnipsel für den Zweck in einer Art und Weise meine Nutzungsmuster von darstellt, die auch das Problem veranschaulicht in Ich betreibe:

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 
    { 
    } 
<# 
} #> 

Dies wird example.tt in einer Datei mit dem Namen gespeichert. Das für diese Datei ausgewählte benutzerdefinierte Tool ist TextTemplatingFileGenerator. Als ich (Versuch) meine Lösung kompilieren, wird die folgende Ausgabe erzeugt:

ErrorGeneratingOutput 

Folgende Fehler auch generiert werden:

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 

Mein erster Versuch, dieses Problem zu lösen, wurde ein Verweis auf Microsoft.CSharp hinzufügen . Meine Bezugspunkte auf die folgende dll:

C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.2\Microsoft.CSharp.dll

dieses Problem zu beheben das Problem nicht. Mein zweiter Versuch, das Problem zu beheben, bestand darin, die Einstellung für das benutzerdefinierte Tool in TextTemplatingFilePreprocessor zu ändern. Dies erzeugte eine Datei, die anscheinend etwas völlig anderes macht, als ich möchte, also behebt das das Problem auch nicht.

Es scheint klar zu sein, dass etwas das Tool TextTemplatingFileGenerator von der Verwendung der anonymen Typisierungsfunktionen von C# .NET 4.0 blockiert. Aber ich weiß nicht, wie ich das ermöglichen soll. Ich habe viel gegoogelt und niemand scheint dieses Problem zu haben.

Wenn jemand mir helfen könnte herauszufinden, wie man anonyme Typen mit Generatoren der Klasse T4 verwendet, wäre das unglaublich hilfreich. Also vielen Dank im Voraus!

Antwort

0

Ich habe schließlich diese Arbeit von explizit angeben, dass für # 4.0 C metaprogramming verwendet werden soll:

<# // 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 
    { 
    } 
<# 
} #> 
Verwandte Themen