2016-05-11 183 views
0

我有一個c#應用程序,它使用T4模板生成嵌入式C代碼。 但是,我有一個小問題,產生的輸出,我不知道是否有一個優雅的解決方案。T4編輯生成的代碼生成

的問題是圍繞兩個I循環使用下面的T4模板循環和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編譯器不喜歡最後一個枚舉條目有逗號。我可以通過檢查這是否是列表中的最後一項來解決這個問題,但是我想知道是否有更優雅的方法?

我的想法是有效地刪除最後一個逗號後,它可能使用退格生成。

那麼有可能添加直接影響生成的代碼的特殊字符?或以其他方式做這件事?

+0

我發現這是你可以使用PushIndex( 「\ t」 的)插入選項卡提供更多的信息。因此,你可以假設(?)你可以使用PushIndex(「\ b」)做一個退格,但是實際上在那裏放置了一個字符集的持有者,所以不會像我所期望的那樣做:( – TheGrovesy

+0

你使用了什麼編譯器不符合) – Luca

+0

@Luca它是一個非常老的ST Cosmic編譯器 – TheGrovesy

回答

1

我認爲這是不可能的。

爲什麼不使用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) 
    ) #> 
+0

非常感謝,我從來沒有使用過之前的Join或Select方法,我必須做出改變才能正確生成:''SD_IDX_「 + x.Name.ToUpper()+「=」+ i)'。也許編輯您的文章與此更正爲他人。謝謝。 – TheGrovesy

+0

我也有一個枚舉,每個枚舉後都有註釋,用於參考。這意味着逗號位於字符串的中間。我怎麼能管理這個?因此,使用我的第一個帖子示例:'SD_IDX _ <#= ScreenDefinitions [i] .Name.ToUpper()#> = <#=i#>,//評論# – TheGrovesy

+0

@TheGrovesy - 查看更新。 '$「...」' - 是在C#6中出現的內插字符串。 –