T4 копировать enum между проектами - PullRequest
1 голос
/ 12 января 2011

У меня есть два проекта в моем решении. Мне нужно скопировать значения из enum1 в Project1 в enum2 в project2. Возможно ли это с помощью T4?

EDIT

Позвольте мне описать мою ситуацию немного лучше. Проект1, в котором находится enum1, генерируется инструментом. В основном это объекты, сгенерированные из базы данных и перечисление имен таблиц. Этот проект1 используется на стороне сервера для взаимодействия с базой данных. Серверная сторона общается с клиентской стороной через WCF. Что касается разделения, я не хочу делиться своим проектом от WCF. Но есть это перечисление с именами сущностей. Я использую имена сущностей на стороне клиента, чтобы сделать некоторые задачи общими. Например, я отправил некоторые значения через WCF (Клиент -> Сервер) и использую имена сущностей для сопоставления значений с соответствующими сущностями.

Ответы [ 2 ]

4 голосов
/ 12 января 2011

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

Однако вы, вероятно, не хотите этого делать.

Но, если вы это сделаете, есть еще более простой способ, вы просто добавляете исходный файл enum в качестве ссылки во второй проект.Добавляя ссылку, вы на самом деле не делаете копию файла, вы просто ссылаетесь на нее в другом проекте, и тогда вам не нужно копаться в T4.Это, однако, предполагает, что вы не хотите изменять перечисление в процессе каким-либо образом.

Чтобы добавить ссылку, просто нажмите Добавить существующий элемент, как обычно, перейдите к исходному файлу перечисления, но накнопка Добавить, есть небольшое выпадающее меню, которое содержит пункт меню ссылки.Используйте это, и вы увидите, что ваш новый файл имеет небольшой символ ссылки, наложенный на его значок в обозревателе решений, что указывает на то, что это ссылка.

Однако причина, по которой я сказал, что вы, вероятно, нетВы хотите сделать это, даже если вы скопируете весь файл перечисления, как он есть, из одного проекта в другой, два перечисления не одного типа.

Другими словами, если вам в одном проекте нужновызовите код в другом проекте, используя перечисление из проекта A при вызове кода в проекте B, который объявлен для использования перечисления в проекте B, не будет работать, это разные типы.Сборка является частью идентификатора типа.

Если вам нужно сделать это, вам нужно либо объявить enum в проекте A (или B), и сослаться на этот проект в другом, либо объявитьэто в третьем проекте, и ссылка на этот третий проект в A и B.

0 голосов
/ 22 августа 2013

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

TT:

<#@ template hostspecific="true" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.IO" #>
<#@ output extension=".cs" #>

<#             
var path=@"..\Domain.Model\MyEnum.cs";
path = this.Host.ResolvePath(path);

var content = File.ReadAllText(path);

// mental note: learn regex once for all¡¡¡
content=content.Replace("namespace Domain.Model", "namespace Domain.Dtos"); #>

<#=content#>
...