![](/img/trans.png)
[英]How to get from class all the interfaces it inherits (using 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
方法收集有用的信息。 您可以使用此方法來獲取有關Methods , Properties和其他語義對象的信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.