Определить доступ к данным из метода в c# - PullRequest
0 голосов
/ 28 марта 2020

У меня есть метод, и я хочу найти все данные, доступные в этом методе.

, например:

public class foo
{
    private int field;

    public void method()
    {
         field = 0;
    }
}

Мне нужен способ узнать (из исходного кода или сборка), что к «полю» обращаются внутри «метода».

Примечание: Я уже использовал Библиотеку Гармонии (https://github.com/pardeike/Harmony), чтобы найти все вызовы методов внутри специфицированного c метода. Было бы удивительно, если бы кто-то знал, как использовать его для поиска данных.

1 Ответ

1 голос
/ 28 марта 2020

, как указано в комментариях, Roslyn DataFlowAnalysis, вероятно, лучший инструмент для работы:

SyntaxTree tree = CSharpSyntaxTree.ParseText(
    @"public class foo
    {
        private int field;
        public void method()
        {
             field = 0;
        }
    }");
var compilation = CSharpCompilation.Create("test").AddSyntaxTrees(tree).AddReferences(MetadataReference.CreateFromFile(typeof(object).Assembly.Location));
var model = compilation.GetSemanticModel(tree);
var methodDeclaration = tree.GetRoot().DescendantNodes().OfType<MethodDeclarationSyntax>().First();

var dataFlow = model.AnalyzeDataFlow(methodDeclaration.Body);
foreach (var symbol in dataFlow.DataFlowsIn)
{
    Console.WriteLine(symbol.Name, symbol.Kind);
}

анализ для вашего конкретного примера дает ссылку на класс foo через неявный this, но не сам field (что технически правильно, но не очень полезно). Предполагая, что ваш реальный код, вероятно, будет иметь немного больше зависимостей - вы можете увидеть лучшие результаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...