C # для форматирования (отступа, выравнивания) C # правильно - PullRequest
4 голосов
/ 25 марта 2009

У нас есть генератор кода, который munges схема данной базы данных для автоматизации нашей внутренней 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

Любая помощь с благодарностью.

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

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

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

Ответы [ 6 ]

6 голосов
/ 25 марта 2009

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

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

5 голосов
/ 25 марта 2009

Расширить ответ Чериана:

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

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

4 голосов
/ 07 ноября 2017

Для правильного отступа кода программным способом вам понадобится пакет nuget Microsoft.CodeAnalysis.CSharp и .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;
}

One-вкладыш:

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

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

1 голос
/ 25 марта 2009

Вы можете использовать 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.NET CodeProvider?

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

0 голосов
/ 25 марта 2009

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

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.

0 голосов
/ 25 марта 2009

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

...