Как программно манипулировать кодом C # в .Net Core? - PullRequest
0 голосов
/ 09 мая 2019

В .Net Core я хочу манипулировать файлом .cs.например я хочу добавить / удалить / изменить методы.Есть ли какая-либо библиотека для этого?

Пример. У меня есть файл Plugins.cs следующим образом:

public class Plugins
{

    public static JToken GetPluginsList(JObject inputs, ControllerBase controlerBase)
    {
        // all plugins in repo
        return true;
    }

    public static JToken GetInstalledPluginsList(JObject inputs, ControllerBase controlerBase)
    {
        return true;
    }

    public static JToken InstallPlugin(JObject inputs, ControllerBase controlerBase)
    {
        return true;
    }

    public static JToken UnInstallPlugin(JObject inputs, ControllerBase controlerBase)
    {
        return true;
    }

    public static JToken RemovePluginFromRepo(JObject inputs, ControllerBase controlerBase)
    {
        // some implementation
        return true;
    }

}

Мне нужны некоторые API для манипулирования приведенным выше кодом.например, я хочу добавить новый метод или получить тело существующего метода.

Что-нибудь вроде этого:

somelib.GetMethodBody("RemovePluginFromRepo").Body

, которое возвращает:

// some implementation
return true;

Ответы [ 3 ]

2 голосов
/ 09 мая 2019

C # не является языком сценариев.Это должно быть скомпилировано до выполнения.Таким образом, хотя вы можете «программно» изменять содержимое файла .cs или любого другого типа файла, это не повлияет на работу / выполнение исполняемого файла.Единственный способ выполнить то, что вы просите - то есть «добавить / удалить / изменить методы», - это использовать делегат.Вам все равно придется в значительной степени создавать все возможные методы, которые могут понадобиться вашей программе, но делегат делает это так, чтобы вы могли передавать методы в качестве параметров, эффективно выполняя то, что вы просите.

0 голосов
/ 09 мая 2019

Есть простой способ:

using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;


SyntaxTree tree = CSharpSyntaxTree.ParseText(sourceCode);

MethodDeclarationSyntax method = tree.GetRoot().DescendantNodes().OfType<MethodDeclarationSyntax>()
    .First(m => m.Identifier.ToString() == "methodName");

method.Body.ToFullString();
0 голосов
/ 09 мая 2019

Вы можете взглянуть на функциональность в пространстве имен System.CodeDom.

https://docs.microsoft.com/en-us/dotnet/api/system.codedom

Возможно, это не совсем то, что вы ожидаете, но, возможно, он предлагает что-то полезное для вас.

...