Да, вам нужно сначала найти в синтаксическом дереве 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
, которая может оказаться для вас полезной.