我是C#和Roslyn的新手。
我正在尝试使用Roslyn查找在代码块中调用哪些方法(不是动态调用只是一个静态信息,这里存在一些函数调用)。
Roslyn有MethodDeclarationSyntax来获取方法的标识符,但我似乎找不到任何方法来获取预定义方法的标识符。
我的程序文件在下面。
的Program.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Symbols;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.MSBuild;
using Microsoft.CodeAnalysis.Text;
namespace CodeAnalysisApp1
{
class Program
{
static void Main(string[] args)
{
SyntaxTree tree = CSharpSyntaxTree.ParseText(
@"using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
namespace TopLevel
{
public void hello()
{
int x;
Console.Writeline(x);
}
public void bye () {int y;}
using Microsoft;
using System.ComponentModel;
namespace Child1
{
using Microsoft.Win32;
using System.Runtime.InteropServices;
class Foo { }
}
namespace Child2
{
using System.CodeDom;
using Microsoft.CSharp;
class Bar { }
}
}");
var root = (CompilationUnitSyntax)tree.GetRoot();
var walker = new UsingCollector();
walker.Visit(root);
foreach (var node in walker.usings)
{
Console.WriteLine(node.Name);
}
foreach (var node in walker.methods)
{
Console.WriteLine(node.Identifier);
}
foreach (var node in walker.pref)
{
Console.WriteLine(node.Keyword);
}
Console.ReadKey();
}
}
}
UsingCollector.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;
namespace CodeAnalysisApp1
{
class UsingCollector : CSharpSyntaxWalker
{
public readonly List<UsingDirectiveSyntax> usings = new List<UsingDirectiveSyntax>();
public readonly List<MethodDeclarationSyntax> methods = new List<MethodDeclarationSyntax>();
public readonly List<PredefinedTypeSyntax> pref = new List<PredefinedTypeSyntax>();
public override void VisitUsingDirective(UsingDirectiveSyntax node)
{
if(node.Name.ToString() != "System" && !node.Name.ToString().StartsWith("System."))
{
this.usings.Add(node);
}
}
public override void VisitMethodDeclaration(MethodDeclarationSyntax node)
{
this.methods.Add(node);
}
public override void VisitPredefinedType(PredefinedTypeSyntax node)
{
this.pref.Add(node);
}
}
}
答案 0 :(得分:0)
听起来你实际上是在尝试获取方法调用,而不是方法定义。使用Visual Studio中的语法Visualiser来查看解析任何给定表达式的语法节点。
在您的情况下,您需要InvocationExpressionSyntax
。