方法体的 BlockSyntax 格式错误

Wrong formatting in BlockSyntax of the method body

我编写的代码为 WebAPI 控制器方法调用生成 class。当我尝试生成方法主体时,我遇到了这样的字符串格式问题:

    public async Task<String> HttpPost(Boolean isSuccess)
    {
            var taskCompletion = new TaskCompletionSource<IRestResponse>(); var  request  =  RestSharpExtensions . PostRequest ( "Test" ,  "HttpPost" ,  isSuccess . ToString ( ) ) ;  var  handle  =  Client . ExecuteAsync ( request ,  r  =>  taskCompletion . SetResult ( r ) ) ;  var  response  =  await  taskCompletion . Task ;  return  JsonConvert . DeserializeObject < String > ( response . Content ) ; 
    }

这是生成方法体的方法:

    private static BlockSyntax GetMethodBody(BaseApiMethodInfo methodInfo, string controllerName)
    {
        var body = new StringBuilder($"var taskCompletion = new TaskCompletionSource<IRestResponse>();{Environment.NewLine}var request = ");
        var dataText = methodInfo.Data != null 
            ? methodInfo.Data.Item2.ToString() 
            : "null";

        var methodParameters = $"\"{controllerName}\", \"{methodInfo.Name}\", {dataText}.ToString()";
        string httpRequestText;
        switch (methodInfo.Method)
        {
            case Method.GET:
                httpRequestText = $"RestSharpExtensions.GetRequest({methodParameters});";
                break;
            case Method.POST:
                httpRequestText = $"RestSharpExtensions.PostRequest({methodParameters});";
                break;
            case Method.PUT:
                httpRequestText = $"RestSharpExtensions.PutRequest({methodParameters});";
                break;
            case Method.DELETE:
                httpRequestText = $"RestSharpExtensions.DeleteRequest({methodParameters});";
                break;
            default:
                throw new ArgumentException("methodInfo.Method");                    
        }

        body.AppendLine(httpRequestText + Environment.NewLine);
        body.AppendLine($"var handle = Client.ExecuteAsync(request, r => taskCompletion.SetResult(r));{Environment.NewLine}");
        body.AppendLine($"var response = await taskCompletion.Task;{Environment.NewLine}");
        body.AppendLine($"return JsonConvert.DeserializeObject<{TypesHelper.GetTypeName(methodInfo.ReturnedType)}>(response.Content);");

        return Block(ParseStatement(body.ToString()));
    }

不幸的是,我没有找到解决这个问题的任何要点。这是对 github 回购的引用: https://github.com/ddydeveloper/Roslyn.ApiClient.Codegen

有人遇到过这样的问题吗?

调用 Formatter.FormatAsync() 到 运行 Roslyn 的格式化程序。

我找到了解决方案。生成方法主体的最佳方法是像这样插入 List<StatementSyntax>

private static BlockSyntax GetMethodBody(BaseApiMethodInfo methodInfo, string controllerName)
{
    var statements = new List<StatementSyntax>();

    ...

    statements.Add(ParseStatement($"var handle = Client.ExecuteAsync(request, r => taskCompletion.SetResult(r));"));
    statements.Add(ParseStatement($"var response = await taskCompletion.Task;"));
    statements.Add(ParseStatement($"return JsonConvert.DeserializeObject<{TypesHelper.GetTypeName(methodInfo.ReturnedType)}>(response.Content);"));

    return Block(statements);
}

在此之后,您只需将 BlockSyntax 添加到您的方法声明中,例如使用 .WithBody(body)