方法体的 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)
我编写的代码为 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)