Вы можете убить двух зайцев одним выстрелом с помощью Roslyn (он же "Платформа компилятора .NET"). Вам понадобится пакет Microsoft.CodeAnalysis.CSharp
.
Во-первых, вы можете использовать класс SyntaxFactory
для генерации синтаксических узлов, которые вы можете объединить в более крупные структуры (члены, методы, классы, пространства имен, единицы компиляции).
Вы также можете получить красиво отформатированное представление ваших синтаксических узлов с помощью ToString()
или ToFullString()
(с правильными отступами и переносами строк и всем прочим), что вы и искали изначально.
В Интернете довольно много уроков по использованию этого API (например, 1 , 2 ), и есть веб-сайт Roslyn Quoter , который может конвертировать кусок кода C # в SyntaxFactory
звонках.
Во-вторых, вы можете затем использовать полученный CSharpSyntaxNode
для создания CSharpSyntaxTree
, который вы можете скомпилировать в IL с помощью CSharpCompilation
(в конце концов, Roslyn является эталонным компилятором C # ).
Если вы хотите, вы можете даже сгенерировать сборку сборки в поток, получить оттуда двоичные данные сборки, загрузить вновь созданную сборку в текущую выполняемую сборку и динамически создать экземпляры только что определенных вами типов.