Я хочу сгенерировать кучу подобных классов на основе значений enum. Эти классы будут тесно связаны по структуре, но из-за безопасности типов C# на практике нецелесообразно использовать наследование для решения этой проблемы. Поэтому предпочтительно использовать T4. В моем случае я хотел бы использовать анонимные типы в моем метапрограммирующем коде.Использование анонимных типов с шаблонами 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
{
}
<#
} #>
Это сохраняется в файле с именем example.tt
. Пользовательский инструмент, выбранный для этого файла, - TextTemplatingFileGenerator
. Когда я (попытка) скомпилировать мое решение, следующий вывод генерируется:
ErrorGeneratingOutput
следующие ошибки генерируются также:
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
Моя первая попытка решить эту проблему было добавить ссылку на Microsoft.CSharp
, Мои ссылки указывает на следующее: DLL
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.2\Microsoft.CSharp.dll
Это не исправить эту проблему. Моя вторая попытка решить проблему состояла в том, чтобы изменить параметр Custom Tool на TextTemplatingFilePreprocessor
. Это создало файл, который, похоже, делает что-то совершенно отличное от того, что я хочу, так что это также не устранило проблему.
Похоже, что что-то блокирует инструмент TextTemplatingFileGenerator
, используя анонимные функции ввода C# .NET 4.0. Но я не понимаю, как это сделать. Я сделал много поисковых запросов, и никто больше не сталкивался с этой проблемой.
Если кто-то может помочь мне выяснить, как использовать анонимные типы с генераторами классов T4, которые были бы невероятно полезны. Так что спасибо всем заранее!