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

时间:2019-05-12 00:05:49

标签: c# roslyn code-analysis roslyn-code-analysis

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

假设我们有以下代码:

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

到目前为止,我的分析器可以将表达式myMovie.Rent()返回为ExpressionSyntax

我要的是在这种情况下分析器找到了使用对象myMovie.Rent()进行方法调用的地方,返回了定义方法并在这种情况下实例化该对象的类是Movie

我很抱歉,如果您有任何想法或代码示例,为什么不为它编写任何代码,我对此表示感谢。

1 个答案:

答案 0 :(得分:1)

首先,在分析器类的Initialize方法内,您应该注册语法节点操作

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方法来收集有用的信息。您可以使用此方法获取有关方法属性和其他语义对象的信息。