Как вы используете .net Reflection с T4? - PullRequest
15 голосов
/ 07 декабря 2009

У меня есть проект c #, который включает в себя текстовый шаблон. Я хотел бы, чтобы этот шаблон генерировал некоторый SQL на основе отражения от классов C # в проекте.

Как получить доступ к содержимому текущего проекта с помощью T4? Возможно ли, и если да, доступно ли Reflection или это доступ только к необработанному источнику, который затем должен быть проанализирован?

Заранее спасибо!

Ответы [ 3 ]

5 голосов
/ 23 декабря 2009

Как получить доступ к содержимому текущего проекта с помощью T4?

Одним из способов является использование COM-компонента EnvDTE. Google T4 и EnvDTE должны привести множество примеров.

Возможно ли, и если да, доступно ли Reflection или есть доступ? просто необработанный источник, который затем должен быть проанализирован?

Отражение определенно доступно от T4. Это работает в основном так, как и следовало ожидать.

Олег Сыч имеет ряд отличных записей в блоге, касающихся общих сценариев использования T4, но есть и множество других ресурсов для T4.

4 голосов
/ 06 июня 2011

Полностью за исключением проблем с блокировкой, будьте осторожны, используя отражение в шаблоне T4. Генератор шаблонов в VS2010 работает с версией 4.0 Framework, поэтому вы можете ввести нежелательные зависимости, если вы генерируете код для версии 3.5 или ниже.

Я только что нашел это трудным путем, после того, как использовал рефлексию, чтобы решить, генерировать ли без параметров или параметризованные вызовы ToString для различных типов BCL. TimeSpan имеет только ToString() в 2.0, но 4.0 добавляет ToString(string): P

0 голосов
/ 16 мая 2011

Хотя это не решает проблемы с блокировкой (хотя я слышал, что VS2010 делает), вы можете попробовать скопировать dll во временную папку и просто использовать эту скопированную сборку

<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ output extension=".txt" #>
<#@ import namespace="System.Reflection" #>
<#@ import namespace="System.IO" #>
<#    
var newFileName = System.IO.Path.GetTempFileName();
System.IO.File.Copy(@"C:\Development\CustomAssembly.dll",newFileName,true);

var assembly = Assembly.LoadFrom(newFileName);
var type = assembly.GetType("CustomAssembly.DummyClass");   
#>
<#=newFileName#>
<#=type#>
...