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!