Roslyn-get方法的返回语句c#

时间:2018-04-26 10:56:42

标签: c# roslyn

使用以下代码,我可以获得方法的引用。现在我想得到这个方法的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();
        }

1 个答案:

答案 0 :(得分:1)

您可以使用LINQ执行此操作。 假设您有一个名为MethodDeclarationSyntax的{​​{1}}变量,代码应为:

method

但是,在您的代码中,我看不到var returnStatement = method.DescendantNodes().OfType<ReturnStatementSyntax>().FirstOrDefault(); 的迹象。您可以使用LINQ获取所需的方法。 另外,请不要致电MethodDeclarationSyntax。使您的方法异步或使用非异步重载。例如,使用.Result

而不是.GetRootAsync()