Извлечение информации о вызываемом методе с помощью Roslyn - PullRequest
0 голосов
/ 12 марта 2019

Мне нужно получить информацию о вызове метода в DLL с помощью Roslyn. Например, у меня есть следующий метод, где dllObject является частью файла DLL.

 public void MyMethod()
 {
     dllObject.GetMethod();
 }

Можно ли извлечь информацию о методе для GetMethod, такую ​​как его имя, имя класса и имя сборки.

1 Ответ

1 голос
/ 17 марта 2019

Да, вам нужно сначала найти в синтаксическом дереве InvocationExpressionSyntax, а затем использовать SemanticModel, чтобы получить для него полный символ, который должен содержать информацию о его полном имени (.ToString()), классе (* 1004). *) и сборка (.ContainingAssembly).

Следующий пример является автономным, поэтому он не использует внешнюю DLL, но тот же подход должен работать для внешних типов.

var tree = CSharpSyntaxTree.ParseText(@"
    public class MyClass {
            int Method1() { return 0; }
            void Method2()
            {
                int x = Method1();
            }
        }
    }");

var Mscorlib = PortableExecutableReference.CreateFromAssembly(typeof(object).Assembly);
var compilation = CSharpCompilation.Create("MyCompilation",
    syntaxTrees: new[] { tree }, references: new[] { Mscorlib });
var model = compilation.GetSemanticModel(tree);

//Looking at the first invocation
var invocationSyntax = tree.GetRoot().DescendantNodes().OfType<InvocationExpressionSyntax>().First();
var invokedSymbol = model.GetSymbolInfo(invocationSyntax).Symbol; //Same as MyClass.Method1

//Get name
var name = invokedSymbol.ToString();
//Get class
var parentClass = invokedSymbol.ContainingType;
//Get assembly 
var assembly = invokedSymbol.ContainingAssembly;

Несколько лет назад я написал небольшую запись в блоге о Semantic Model, которая может оказаться для вас полезной.

...