使用以下代码,我可以获得方法的引用。现在我想得到这个方法的return语句。我知道我应该使用ReturnStatementSyntax。我是Roslyn的新手,所以不确定如何获得方法的返回语句。
public List<ReferencedSymbol> Find(string solutionPath, string methodName)
{
var msWorkspace = MSBuildWorkspace.Create();
var solution = msWorkspace.OpenSolutionAsync(solutionPath).Result;
InvocationExpressionSyntax node = null;
ISymbol symbol = null;
bool flag = false;
foreach (var project in solution.Projects)
{
foreach (var document in project.Documents)
{
var model = document.GetSemanticModelAsync().Result;
var methodInvocation = document.GetSyntaxRootAsync().Result;
node = methodInvocation.DescendantNodes().OfType<InvocationExpressionSyntax>()
.Where(x => ((MemberAccessExpressionSyntax)x.Expression).Name.ToString() == methodName)
.FirstOrDefault();
//I am not sure how should I get return statement for a method using ReturnStatementSyntax
var returnStatement = methodInvocation.DescendantNodes().OfType<ReturnStatementSyntax>().ToList();
if (node == null)
continue;
symbol = model.GetSymbolInfo(node).Symbol;
flag = true;
break;
}
if (flag) break;
}
return SymbolFinder.FindReferencesAsync(symbol, solution).Result.ToList();
}
答案 0 :(得分:1)
您可以使用LINQ执行此操作。
假设您有一个名为MethodDeclarationSyntax
的{{1}}变量,代码应为:
method
但是,在您的代码中,我看不到var returnStatement = method.DescendantNodes().OfType<ReturnStatementSyntax>().FirstOrDefault();
的迹象。您可以使用LINQ获取所需的方法。
另外,请不要致电MethodDeclarationSyntax
。使您的方法异步或使用非异步重载。例如,使用.Result
.GetRootAsync()