![](/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.