2013-06-15 2 views
5

У меня есть файл T4 C#, в котором мне нужно ссылаться на константу в статическом классе. Статический класс находится в том же пространстве имен.T4 ссылается на константу в статическом классе во время компиляции

Возможно ли это?

Ниже представлена ​​только иллюстрация. Мне нужно рассчитать фактическую константу на основе существующих констант, но есть также вызов метода расширения. Чтобы это было просто, я просто проиллюстрировал эту концепцию.

.cs файл:

namespace me 
{ 
    pubic static class Stat 
    { 
    public const int Const = 1; 
    } 
} 

. tt file:

... 
namespace me 
{ 
    pubic static int Test 
    { 
    return <#= Stat.Const #>; 
    } 
} 
+0

Это хороший вопрос. Это обычная проблема, и ответ не очевиден. Думаю, я могу написать сообщение в блоге об этом;). –

+0

Пожалуйста, соединитесь со своим сообщением, когда вы закончите, чтобы я мог подробно ответить на этот вопрос. – IamIC

+1

Пара других идей. Константа может быть «принадлежащей» файлу TT и выводиться как часть процесса генерации. Или попробуйте roslyn для анализа файла, содержащего const, и извлеките его из дерева синтаксиса. – FuleSnabel

ответ

3

Это действительно возможно. Однако сначала вам нужно сделать пару вещей:

  1. Убедитесь, что ваш класс и const являются общедоступными (что они и есть).
  2. Создайте свое решение для создания dll (которое будет содержать статический класс и const, которые вы хотите ссылаться).
  3. Ссылка на текущий узел в вашем .TT с <#@ assembly name="$(TargetPath)" #>
  4. Reference пространства имен, в котором ваш статический класс найден с <#@ import namespace="ns" #>
  5. Сформировать свой .TT.
  6. Восстановите свое решение, чтобы включить только что сгенерированный код в сборку.

Это должно быть сделано. Трудный бит в понимании того, что ваш .tt не работает, как любой старый файл класса в вашем проекте. Поскольку он сгенерирован, ему нужно что-то генерировать, что в данном случае является вашей DLL проекта, которую вы должны создать заранее.


И, как обещали, here is the blog post I wrote about this question :)

+0

Означает ли это, что константа должна находиться в другой сборке, чтобы на нее можно было ссылаться? – IamIC

+0

Нет, но вам придется регенерировать вашу .dll во второй раз, чтобы включить код, сгенерированный из .tt. Если у вашего сгенерированного файла кода есть ошибки сборки, вы должны будете удалить его содержимое перед регенерацией. –

+0

Получил работу, спасибо! – IamIC

Смежные вопросы