簡體   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