繁体   English   中英

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

[英]How to get the class identifier from object instantiation using Roslyn

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

假设我们有以下代码:

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

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

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

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

首先,在分析器类的Initialize方法内部,应注册语法节点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和其他语义对象的信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM