2013-05-02 5 views
0

Я использую шаблоны T4 по умолчанию для генерации кода на основе моей модели UML. У меня есть несколько классов, которые выставляют параметры шаблона. Они генерируют код, как ожидалось. Например, класс MessageResponse предоставляет параметр TMessageType. Это генерирует код, как ожидалось:Visual Studio 2010 T4 Code Generation для шаблонных типов

public class MessageResponse<TMessageType> 

{} 

Проблема возникает, когда я привязываю этот параметр к другому классу. Например, я создаю класс с именем AccountMessageResponse, который привязывает параметр шаблона к учетной записи вызова класса. То, что я ожидаю увидеть, является сгенерированным классом следующим образом:

public class AccountMessageResponse : MessageResponse<Account> 

{} 

Однако код не генерируется. Когда я смотрю на выходной журнал для генерации кода я вижу это сообщение:

'RestModels::AccountMessageResponse' - (Class): no file generated because the 'AppliesToElement' method of the template 'ServiceClassTemplate.t4' evaluated to false. 

ли генерация кода для шаблонных типов не поддерживается в текущих шаблонов по умолчанию? Это что-то мне нужно сделать самому, или я делаю что-то неправильно?

Благодаря

ответ

0

Кажется, проблема возникает, когда вы объединяете шаблонные тип с отношениями наследования. Вот обходной путь. Для достижения требуемых результатов все, что вам нужно сделать, это:

1) Добавьте параметр шаблона, TMessageType, в свой класс RequestMessage. Это вызовет следующее:

public class RequestMessage<TMessageType> 
{} 

2) Создайте класс AccountRequestMessage.

3) Задайте параметр TemplateBinding для AccountRequestMessage для 'RequestMessage'. Затем установите для класса TemplateBinding значение «Учетная запись». Затем будет генерироваться следующее, где бы вы не ссылались на AccountRequestMessage. Например, если у вас есть операция Foo, которая возвращает AccountRequestMessage следующий код будет сгенерирован:

public RequestMessage<Account> Foo() 
{} 

4) Если вам нужно создать фактический класс, то нужно добавить новый класс AccountRequestMessageImpl, который наследуется от AccountRequestMessage. Это будет генерировать:

public AccountRequestMessageImpl : RequestMessage<Account> 
{} 

Это немного счетчик интуитивно, но это проще, чем пытаться изменить шаблоны T4.

Nick

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