Для шаблонов T4, которые создают классы Metadata, Service и ViewModel (которые я хочу изменить), я хотел иметь возможность объединять новые шаблоны с существующими, а также создавать любые новые для новых сущностей поэтому я создаю резервную копию файла (.BAK) перед вызовом fileManager.StartNewFile ...
foreach (EntityType entity in ItemCollection.GetItems<EntityType>().OrderBy(e => e.Name))
{
var outputPath = Path.GetDirectoryName(Host.TemplateFile);
var outputFile = entity.Name + ".ViewModel.cs";
var fileName = Path.Combine(outputPath, outputFile);
if (File.Exists(fileName))
{
var newName = fileName + ".BAK";
File.Move(fileName, newName);
}
fileManager.StartNewFile(outputFile);
, а затем после fileManager.Process я объединяю файл .BAK и новый, используя DiffMerge SourceGear ...
fileManager.Process();
System.Diagnostics.Process p = new System.Diagnostics.Process();
foreach (EntityType entity in ItemCollection.GetItems<EntityType>().OrderBy(e => e.Name))
{
var outputPath = Path.GetDirectoryName(Host.TemplateFile);
var outputFile = entity.Name + ".ViewModel.cs";
var fileName = Path.Combine(outputPath, outputFile);
var newName = fileName + ".BAK";
if (File.Exists(newName))
{
String s = String.Format("-m -nosplash \"{0}\" \"{1}\" \"{2}\"", fileName, fileName, newName);
p.StartInfo.Arguments = s;
p.StartInfo.FileName = "C:\\Program Files (x86)\\SourceGear\\DiffMerge\\DiffMerge.exe";
p.StartInfo.Verb = "Open";
p.Start();
p.WaitForExit();
File.Delete(newName);
}
}
Работает довольно хорошо, и, поскольку DiffMerge - приложение с графическим интерфейсом, я могу обрабатывать конфликты и т. Д. Перед сохранением.