【问题标题】:Roslyn-get return statement of a method c#Roslyn-get 方法 c# 的返回语句
【发布时间】:2018-04-26 21:47:23
【问题描述】:

通过以下代码,我可以获得方法的引用。现在我想得到这个方法的返回语句。我知道我应该使用 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();
        }

【问题讨论】:

    标签: c# roslyn


    【解决方案1】:

    您可以使用 LINQ 简单地做到这一点。 假设你有一个名为methodMethodDeclarationSyntax变量,代码应该是:

    var returnStatement = method.DescendantNodes().OfType<ReturnStatementSyntax>().FirstOrDefault();
    

    但是,在您的代码中,我没有看到 MethodDeclarationSyntax 的迹象。您可以使用 LINQ 获得所需的方法。 另外,请勿拨打.Result。使您的方法异步或使用非异步重载。例如,不要使用.GetRootAsync(),而是使用.GetRoot()

    【讨论】:

    • 请注意,这将为本地函数或 lambdas 返回错误的节点。
    猜你喜欢
    • 1970-01-01
    • 2022-11-11
    • 2018-05-23
    • 2013-10-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-09
    • 2022-07-28
    • 2013-03-10
    相关资源
    最近更新 更多