2017-06-05 14 views
0

WebAPIコントローラメソッド呼び出し用のクラスを生成するコードを記述しました。私は、生成されたメソッド本体にしようとすると、私はこのように、フォーマット文字列に問題があります。メソッド本体のBlockSyntaxでフォーマットが正しくありません

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())); 
    } 

は、残念ながら、私はこの問題を解決するための任意のポイントを見つけるdid't:

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) ; 
    } 

をこれは、メソッド本体を生成する方法であります問題。これはgithubリポジトリへの参照です。 https://github.com/ddydeveloper/Roslyn.ApiClient.Codegen

誰でもこのような問題がありましたか?

答えて

0

解決策が見つかりました。メソッドの本体を生成するための最善の方法は、次のようにList<StatementSyntax>に挿入されています。あなたは自分のメソッド宣言にBlockSyntaxを追加し、この後

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); 
} 

、私は `Formatter.FormatAsync`を呼び出そうとしました.WithBody(body)

0

Roslynのフォーマッタを実行するにはFormatter.FormatAsync()を呼び出します。

+0

使用して、たとえば。残念ながら、それは私を助けませんでした。 Microsoft.Composition 1.0.27を使用しているため、.NETコアアプリケーションでのMircosoft.CodeAnalysisナゲットパッケージの互換性にも問題がありました。 –

関連する問題