如何在声明中有条件地设置基类

时间:2011-09-20 23:59:08

标签: c# .net entity-framework t4

我有一个修改过的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 个答案:

答案 0 :(得分:11)

您提供的硬编码: 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 Tools \ Templates \ Includes \ EF.Utility.CS.ttinclude

<#= #>标记之间的脚本部分只是C#表达式,这些表达式返回的字符串是内联插入的。

code.Escape方法将返回类型名称(作为字符串)或空字符串。

code.StringBefore将在第二个字符串(基本类型名称)之前追加第一个字符串(" : "),但前提是第二个字符串不为null或为空。

要做你想要完成的事情,你可以使用他们使用的相同技巧,但相反。遗憾的是,您无法使用现有的类,因为它们没有某种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))#>