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

У нас есть генератор кода, который изменяет схему данной базы данных для автоматизации наша собственная 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(VS.80).aspx, но я не уверен, содержит ли он какие-либо классы, которые могли бы помочь .

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


person Paul Suart    schedule 25.03.2009    source источник


Ответы (6)


Чтобы развернуть ответ Чериана:

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

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

person Dan McClain    schedule 25.03.2009

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

Один лайнер:

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

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

person Anton Krouglov    schedule 07.11.2017
comment
Хороший ответ, 8,5 лет спустя .... :) Кажется, я помню, что генератор кода, о котором я спрашивал, был .NET 2.0. - person Paul Suart; 07.11.2017
comment
Недавно у меня была такая же проблема, и я искал в Google ваши вопросы и несколько других. - Актуальных ответов не было вообще, поэтому пришлось написать один. - person Anton Krouglov; 07.11.2017
comment
У меня возникла ошибка: «SyntaxNode» не содержит определения для «NormalizeWhitespace», а для лучшей перегрузки метода расширения «SyntaxExtensions.NormalizeWhitespace (SyntaxToken, string, string, bool)» требуется получатель типа «SyntaxToken - person Karthic G; 01.12.2020
comment
@KarthicG Мне понадобился ВОЗРАСТ, чтобы разобраться с этим, поскольку у меня была та же проблема - добавление using Microsoft.CodeAnalysis в верхней части моего класса заставило его исчезнуть, это должен быть метод расширения, который работает с SyntaxNode. - person Dan Roberts; 01.04.2021

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

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

person Cherian    schedule 25.03.2009
comment
Спасибо за ответ, но мне это не поможет, так как я хотел бы отформатировать код из своего кода. - person Paul Suart; 25.03.2009
comment
Я люблю NArrange. NArrange вызывается из командной строки, поэтому вы можете вызвать его из кода - person Dan McClain; 25.03.2009
comment
Разве это не потребовало бы, чтобы я установил его на машине, на которой я запускаю код, или есть ли распространяемая dll, которую я могу включить в свое приложение? Спасибо. - person Paul Suart; 25.03.2009
comment
Исходный код доступен, поэтому вы должны иметь возможность интегрировать и распространять. Если да, обязательно соблюдайте лицензию - person Dan McClain; 25.03.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 - довольно болтливый способ создания кода. Хорошо то, что вы можете создавать несколько языков. Возможно, вам удастся найти CodeProvider на Erlang.NET?

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

person Hallgrim    schedule 25.03.2009
comment
Привет, Халлгрим. Да, я отказался от этого способа генерации кода из-за его многословности. Без переписывания нашего генератора кода я мало что могу сделать. Вы знаете, есть ли в System.CodeDom метод форматирования файла класса? - person Paul Suart; 25.03.2009
comment
У CSharpCodeProvider был метод CreateParser (), но он никогда не возвращал ничего, кроме null, и теперь является устаревшим. - person Hallgrim; 25.03.2009

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

person Greg Hurlman    schedule 25.03.2009
comment
Нет, это приложение winforms. Спасибо, в любом случае. - person Paul Suart; 25.03.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.

person Randolpho    schedule 25.03.2009
comment
Привет, Рандольфо. Вы еще ближе всех, но, к сожалению, ваш метод требует от меня наличия экземпляра VS, работающего вместе с моим приложением winforms. Можете ли вы придумать способ создать экземпляр VS из моего приложения (если это вообще возможно)? Спасибо. - person Paul Suart; 25.03.2009