C # для правильного форматирования (отступ, выравнивание) C #

StackOverflow https://stackoverflow.com/questions/681500

Вопрос

У нас есть генератор кода, который жует схема данной базы данных для автоматизации нашей внутренней n-уровневой архитектуры.Выходные данные представляют собой различные частичные классы C #, по одному на файл.

В коде для удаления всех строк мы стараемся максимально соблюдать отступы и форматирование, но неизменно, когда вы открываете файл в Visual Studio, форматирование получается неправильным.Быстрое нажатие ctrl-k, ctrl-d исправляет это, но, очевидно, это переформатирование теряется при следующем создании класса.

Что я хотел бы знать, так это есть ли способ, которым я могу каким-то образом автоматически форматировать содержимое текстового файла так же, как это делает Visual Studio?

Псевдокод

Create "code" object, passing text file to constructor
Invoke "format" method
Re-save text file

Любая помощь очень ценится.

Редактировать: Я должен уточнить - я хочу иметь возможность вызывать форматирование из моего кода на C #, который создает текстовый файл, содержащий мой сгенерированный C #.Формат кода может быть стандартизирован (не обязательно для каждого разработчика), и я не хочу устанавливать какие-либо сторонние приложения.

Кажется, я помню, что существует пространство имен, содержащее множество классов для создания C # на C#: http://msdn.microsoft.com/en-us/library/system.codedom (ПРОТИВ 80).aspx, но я не уверен, содержит ли он какие-либо классы, которые могли бы помочь.

ДАЛЬНЕЙШЕЕ РЕДАКТИРОВАНИЕ: Мой генератор кода - это приложение winforms, развернутое с помощью установки одним щелчком мыши.Он используется многими собственными разработчиками.Мне нужно решение, которое не требует, чтобы у каждого разработчика был установлен инструмент на их компьютере.

Это было полезно?

Решение

Чтобы подробнее остановиться на ответе Шериана:

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

Вам должны понадобиться только DLL-файлы и просто посмотрите на exe-файл о том, как вызвать форматирование.Это также создаст резервную копию форматируемого кода.Это действительно хороший инструмент, если он соответствует вашим потребностям.

Другие советы

Взгляните на Нарранж.Вероятно, вам нужно будет автоматизировать эти вещи как часть сборки.
Однако не уверен, соответствует ли он всем вашим требованиям.
Процитировать:

NArrange - это средство для улучшения кода .NET которое автоматически упорядочивает код члены и элементы в .NET классы.

Чтобы правильно расставлять отступы в коде программно, вам понадобится Microsoft.CodeAnalysis.Пакет CSharp nuget и .NET framework 4.6+.Пример кода:

public string ArrangeUsingRoslyn(string csCode) {
    var tree = CSharpSyntaxTree.ParseText(csCode);
    var root = tree.GetRoot().NormalizeWhitespace();
    var ret = root.ToFullString();
    return ret;
}

Однострочный:

csCode = CSharpSyntaxTree.ParseText(csCode).GetRoot().NormalizeWhitespace().ToFullString();

Вы также можете использовать Нарранж для сортировки методов в вашем файле cs, упорядочивания использования, создания регионов и т.д.Обратите внимание, что NArrange ничего не делает с отступом.

Вы можете использовать CodeDom и CSharpCodeProvider.Все это находится в пространствах имен Microsoft.CSharp и System.CodeDom.

Она является примером собственности:

StringWriter writer = new StringWriter();
CSharpCodeProvider provider = new CSharpCodeProvider();
CodeMemberProperty property = new CodeMemberProperty();
property.Type = new CodeTypeReference(typeof(int));
property.Name = "MeaningOfLifeUniverseAndEverything";
property.GetStatements.Add(new CodeMethodReturnStatement(new CodePrimitiveExpression(42)));
provider.GenerateCodeFromMember(property, writer, null);
Console.WriteLine(writer.GetStringBuilder().ToString());

Этот код сгенерирует:

private int MeaningOfLifeUniverseAndEverything {
    get {
        return 42;
    }
}

CodeDom - это довольно простой способ генерации кода.Хорошая вещь заключается в том, что вы можете генерировать несколько языков.Возможно, вы сможете найти Erlang.СЕТЕВОЙ поставщик кода?

Возможно, вы сможете создать несколько ярлыков, используя CodeSnippetExpression .

Только если вы запускаете генератор кода как дополнение VS - у каждого разработчика будут разные настройки.

Вот как это сделать из контекста макроса или надстройки:

var dte = (EnvDTE80.DTE2)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE.8.0");
dte.ExecuteCommand("File.OpenFile", filename);
dte.ExecuteCommand("Edit.FormatDocument", filename);
dte.ActiveDocument.Close(vsSaveChanges.vsSaveChangesYes);

Предупреждение:Как говорит @Greg Hurlman, выходные данные будут варьироваться в зависимости от текущих параметров пользователя.

Редактировать:

к сожалению, ваш метод требует, чтобы у меня был экземпляр VS, работающий вместе с моим приложением winforms.Можете ли вы придумать способ создать экземпляр VS из моего приложения (если это вообще возможно)?

Я думаю, что это можно было бы сделать из вашего Win.Приложение Form.Однако вам необходимо будет установить Visual Studio на компьютере, на котором выполняется код.

Попробуй это:

var dte = (EnvDTE80.DTE2)Microsoft.VisualBasic.Interaction.CreateObject("VisualStudio.DTE.8.0", "");
dte.ExecuteCommand("File.OpenFile", filename);
dte.ExecuteCommand("Edit.FormatDocument", filename);
dte.ActiveDocument.Close(vsSaveChanges.vsSaveChangesYes);

Имейте в виду, что вам понадобятся ссылки на сборку EnvDTE80.dll.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top