2016-09-05 6 views
0

Я хочу сгенерировать кучу подобных классов на основе значений 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, которые были бы невероятно полезны. Так что спасибо всем заранее!

ответ

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