Как условно установить базовый класс в объявлении - PullRequest
4 голосов
/ 21 сентября 2011

У меня есть модифицированный шаблон T4, который создает классы из моего edmx и работает нормально, за исключением производных классов.

Product : BaseItem // works fine as do all top level classes

TranslatedProduct : Product : BaseItem  // dang

Я запутался в том, как и где я могу условно настроить шаблон T4 на игнорирование: BaseItem в случае производного класса - т.е.

TranslatedProduct : Product

Например:

<#=Accessibility.ForType(entity)#> <#=code.SpaceAfter(code.AbstractOption(entity))#>partial class <#=code.Escape(entity)#><#=code.StringBefore(" : ", code.Escape(entity.BaseType))#> : BaseItem

В своей голове я представлял это как -

if(code.Escape(entity.BaseType).Equals(string.empty)
{
   <#=Accessibility.ForType(entity)#> <#=code.SpaceAfter(code.AbstractOption(entity))#>partial class <#=code.Escape(entity)#> : BaseItem
}
else
{
<#=Accessibility.ForType(entity)#> <#=code.SpaceAfter(code.AbstractOption(entity))#>partial      class <#=code.Escape(entity)#><#=code.StringBefore(" : ", code.Escape(entity.BaseType))#>
}

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

1 Ответ

11 голосов
/ 21 сентября 2011

Сценарии, которые вы предоставили жестким кодом : BaseItem для постоянного отображения. Это кажется сломанным.

Оригинальный код:

<#=Accessibility.ForType(entity)#> <#=code.SpaceAfter(code.AbstractOption(entity))#>partial class <#=code.Escape(entity)#><#=code.StringBefore(" : ", code.Escape(entity.BaseType))#>

Используется класс, определенный в:

C: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ Common7 \ IDE \ Extensions \ Microsoft \ Инструменты Entity Framework \ Templates \ Includes \ EF.Utility.CS.ttinclude

Части сценария между тегами <#= #> являются просто выражениями C #, а строки, возвращаемые этими выражениями, вставляются в строку.

Метод code.Escape вернет либо имя типа (в виде строки), либо пустую строку.

code.StringBefore добавит первую строку (" : ") перед второй строкой (именем базового типа), но только если вторая строка не пуста или не пуста.

Чтобы сделать то, что вы пытаетесь выполнить, вы можете использовать тот же трюк, который они используют, но в обратном порядке. К сожалению, вы не можете использовать их существующий класс, потому что у них нет какого-то AppendIfNotDefined метода. Поэтому мы просто будем использовать более сложное выражение.

Вместо:

code.StringBefore(" : ", code.Escape(entity.BaseType))

Мы напишем:

code.StringBefore(" : ",
    string.IsNullOrEmpty(code.Escape(entity.BaseType))
        ? "BaseItem"
        : code.Escape(entity.BaseType)
    )

Вот вся строка, все собрано вместе:

<#=Accessibility.ForType(entity)#> <#=code.SpaceAfter(code.AbstractOption(entity))#>partial class <#=code.Escape(entity)#><#=code.StringBefore(" : ", string.IsNullOrEmpty(code.Escape(entity.BaseType)) ? "BaseItem" : code.Escape(entity.BaseType))#>
...