T4 编辑生成的代码作为其生成的
T4 editing the generated code as its generated
我有一个 c# 应用程序,它使用 T4 模板生成嵌入式 C 代码。
但是我对结果输出有一个小问题,我想知道是否有一个优雅的解决方案。
问题是我使用以下 T4 模板围绕 for 循环和 foreach 循环创建枚举和其他表:
typedef enum eSDef_Index
{
<# for (int i = 0; i < ScreenDefinitions.Count(); i++)
{ #>
SD_IDX_<#=ScreenDefinitions[i].Name.ToUpper() #> = <#=i#>,
<# }
// >>>> Can we do a backspace here?
#>
}eSDEF_INDEX;
这成功创建了我想要的枚举。但是,我使用的 C 编译器不喜欢最后一个枚举条目有逗号。我可以通过检查这是否是列表中的最后一项来解决这个问题,但是我想知道是否有更优雅的方法?
我的想法是在最后一个逗号生成后使用退格键有效地删除它。
那么是否可以添加直接影响生成代码的特殊字符?或任何其他方式来做到这一点?
我觉得不可能。
为什么不使用string.Join
方法?
typedef enum eSDef_Index
{
<#= string.Join(",\r\n ",
ScreenDefinitions.Select((x, i) =>
$"SD_IDX_{x.Name.ToUpper()} = {i}")
) #>
}eSDEF_INDEX;
将注释放入第一个参数(分隔符):
<#= string.Join(", // Comment \r\n ",
ScreenDefinitions.Select((x, i) =>
"SD_IDX_" + x.Name.ToUpper() + " = " + i)
) #>
我有一个 c# 应用程序,它使用 T4 模板生成嵌入式 C 代码。 但是我对结果输出有一个小问题,我想知道是否有一个优雅的解决方案。
问题是我使用以下 T4 模板围绕 for 循环和 foreach 循环创建枚举和其他表:
typedef enum eSDef_Index
{
<# for (int i = 0; i < ScreenDefinitions.Count(); i++)
{ #>
SD_IDX_<#=ScreenDefinitions[i].Name.ToUpper() #> = <#=i#>,
<# }
// >>>> Can we do a backspace here?
#>
}eSDEF_INDEX;
这成功创建了我想要的枚举。但是,我使用的 C 编译器不喜欢最后一个枚举条目有逗号。我可以通过检查这是否是列表中的最后一项来解决这个问题,但是我想知道是否有更优雅的方法?
我的想法是在最后一个逗号生成后使用退格键有效地删除它。
那么是否可以添加直接影响生成代码的特殊字符?或任何其他方式来做到这一点?
我觉得不可能。
为什么不使用string.Join
方法?
typedef enum eSDef_Index
{
<#= string.Join(",\r\n ",
ScreenDefinitions.Select((x, i) =>
$"SD_IDX_{x.Name.ToUpper()} = {i}")
) #>
}eSDEF_INDEX;
将注释放入第一个参数(分隔符):
<#= string.Join(", // Comment \r\n ",
ScreenDefinitions.Select((x, i) =>
"SD_IDX_" + x.Name.ToUpper() + " = " + i)
) #>