我有一个实现CSharpSyntaxRewriter的CustomRewriter。在VisitClassDeclaration或VisitMethodDeclaration中,我需要检查该类可能实现的任何接口。
原因是VisitMethodDeclaration正在寻找进行数据调用的方法,并且正在向方法添加参数。这很有效。但是,如果修改方法签名,我需要它来检查Method的更改是否来自已实现的接口,如果是,则修改接口。
我无法找到从Class& amp;获取此信息的方法。方法DeclarationNode参数,也不是语法树或语法节点。我还添加了Compilation作为构造函数Parm,以便使用它来获取SchematicModel并以某种方式从那里开始,但没有任何运气。
public class DetermineIfInterfaceMethodRewriter : CSharpSyntaxRewriter
{
private string Test = string.Empty;
private Compilation comp;
public DetermineIfInterfaceMethodRewriter(Compilation compilation)
{
this.comp = compilation;
}
public override SyntaxNode VisitClassDeclaration(ClassDeclarationSyntax node)
{
return base.VisitClassDeclaration(node);
}
public override SyntaxNode VisitMethodDeclaration(MethodDeclarationSyntax node)
{
var tree = node.SyntaxTree;
var root = tree.GetRoot();
return node;
}
}
答案 0 :(得分:1)
您需要使用语义模型:
GetDeclaredSymbol(classDeclarationSyntax)
获取该课程的ITypeSymbol
。AllInterfaces
以获取其所有已实现的接口。答案 1 :(得分:1)
此信息可从INamedTypedSymbol
获取,可通过SemanticModel GetDeclaredSymbol
方法获取。获得类的符号后,可以调用AllInterfaces
来获取已实现接口的集合。
public override SyntaxNode VisitClassDeclaration(ClassDeclarationSyntax node)
{
var tree = node.SyntaxTree;
var root = tree.GetRoot();
var sModel = comp.GetSemanticModel(node.SyntaxTree);
var classSymbol = sModel.GetDeclaredSymbol(root.DescendantNodes().OfType<ClassDeclarationSyntax>().First());
var implementedInterfaces = classSymbol.AllInterfaces;
return base.VisitClassDeclaration(node);
}