2016-05-11 12 views
0

У меня есть приложение C#, которое генерирует встроенный код C с использованием шаблонов T4. Однако у меня есть небольшая проблема с результирующим выходом, о котором я задаюсь вопросом, есть ли элегантное решение.T4 редактирование сгенерированного кода в его сгенерированном

Этот вопрос я петля вокруг как для петель и Еогеаспа для создания перечислений и других таблиц, используя следующий шаблон T4:

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, который я использую, не любит, чтобы последняя запись enum имела запятую. Я мог бы исправить это, проверив, является ли это последним элементом в списке, однако я задаюсь вопросом, есть ли более эльгетический способ?

Моя идея состояла в том, чтобы эффективно удалить последнюю запятую после ее генерации, используя, возможно, обратное пространство.

. Можно ли добавить специальные символы, которые непосредственно влияют на сгенерированный код? или любой другой способ сделать это?

+0

Я нашел немного больше информации, которая является то, что вы можете использовать PushIndex ("\ т"), чтобы вставить вкладку. Поэтому можно было бы предположить (?), Что вы можете сделать PushIndex («\ b»), чтобы сделать backspace, однако на самом деле вместо него помещает владелец charater, поэтому не делает так, как я ожидал бы :( – 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. –

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

  • Нет связанных вопросов^_^