如何使用 Roslyn 从对象实例化中获取 class 标识符

How to get the class identifier from object instantiation using Roslyn

我正在尝试创建一个分析器,它将找到每个方法调用的来源,尤其是定义方法的 class。

假设我们有以下代码:

 Movie myMovie = new Movie();
 myMovie.Rent();

我的分析器到现在为止可以return表达式myMovie.Rent()作为ExpressionSyntax

我真正想要的是,在这种情况下,分析器找到了使用对象的方法调用 myMovie.Rent(),returns class 定义了方法和对象在这种情况下实例化为 Movie.

我被阻止了为什么我没有为它编写任何代码如果你有任何想法或代码示例,我很感激。

首先,在您的分析器 class 中,您应该在 Initialize 方法中注册 syntax node action:

public override void Initialize(AnalysisContext context)
{
    context.RegisterSyntaxNodeAction(SyntaxNodeAnalyze, SyntaxKind.InvocationExpression);
}

在此方法中,我们注册了 SyntaxNodeAnalyze 方法以从分析器获取回调。在这个方法中,通过使用 'SyntaxNodeAnalysisContext' 我们可以查询有关 semantic objects 的信息。在下面的示例中,我使用 SemanticModel 来枚举我声明的自定义属性,现在,我在方法声明之上使用它们。

private static void SyntaxNodeAnalyze(SyntaxNodeAnalysisContext context)
{
    SemanticModel semanticModel = context.SemanticModel;
    InvocationExpressionSyntax method = (InvocationExpressionSyntax)context.Node;

    var info = semanticModel.GetSymbolInfo(method).Symbol;
    if (info == null)
         return new List<AttributeData>();

    var attribs = info.GetAttributes().Where(f => f.AttributeClass.MetadataName.Equals(typeof(ThrowsExceptionAttribute).Name));

    foreach (var attrib in attribs)
    {
        ...
    }            
}

正如您在上面的代码中看到的,我们可以使用'SemanticModel'的GetSymbolInfo方法收集有用的信息。您可以使用此方法获取有关 MethodsProperties 和其他语义对象的信息。