2016-04-06 7 views
1

よく定義されたモデルを使用して、よく定義されたWeb APIにLINQプロバイダを構築しようとしています。Task.Resultオブジェクトの取得時に、非同期のジェネリックメソッドをリフレクションで呼び出すカスタムLINQプロバイダが失敗する

それは、すべてのピースが提供してまとめることが必要な部分になったまでそれはうまくいったが、実行非ジェネリックがあります。私は、これらのウォークスルーを、次のいメソッドは、リフレクションを使用してカスタムHTTPRequestクラスの非同期メソッドが呼び出され、その部分が非常にうまく動作するため、返されたTaskオブジェクトのResultプロパティの値を取得しようとすると、TargetExceptionが " :オブジェクトがターゲットタイプと一致しません。

これは、例外が発生したコードですが、私は他の部分が関連しているとは思わない:

 public override object Execute(Expression expression) 
     { 
      var elementType = TypeSystem.GetElementType(expression.Type); 

      var task = GetResult(expression, elementType); 
      var resultProperty = typeof (Task<>).MakeGenericType(elementType).GetProperty("Result"); 

      //It fails here! 
      var result = resultProperty.GetValue(task); 

      return result; 
     } 

     private async Task GetResult(Expression expression, Type elementType) 
     { 
      var requestUrl = Translate(expression); 

      var method = _httpRequest.GetType().GetMethod("GetHttpRequest").MakeGenericMethod(new[] { elementType }); 
      var task = (Task) method.Invoke(_httpRequest, new object[] { requestUrl }); 
      await task; 
     } 

私が返される必要があるオブジェクトがIEnumerableをあるべきことを考えていると、何が来ていますResultプロパティのうち1つはTですが、これに対処しなければならないと確信していますが、現在の例外の理由は信じられません。

何か助けていただければ幸いです。

+0

'async Task GetResult'そのメソッドから返されるタスクはあなたが'待っている 'ものではないため、結果はありません。 –

答えて

2

あなたはここにTask<ElementType>.Resultプロパティを取得:

var resultProperty = typeof (Task<>).MakeGenericType(elementType).GetProperty("Result"); 

そして、あなたはタイプTask(注 - ないTask<ElementType>)のオブジェクトに適用されているあなたのgetResult戻ります。したがって、間違った型のオブジェクトをPropertyInfo.GetValueメソッドに渡しているため、例外が発生します。修正するには

、単に実行します。今

private Task GetResult(Expression expression, Type elementType) 
    { 
     var requestUrl = Translate(expression); 

     var method = _httpRequest.GetType().GetMethod("GetHttpRequest").MakeGenericMethod(new[] { elementType }); 
     var task = (Task) method.Invoke(_httpRequest, new object[] { requestUrl }); 
     return task; 
    } 

、のgetResultはまだTaskを返すにもかかわらず、我々はそれが本当に(ここで私は_httpRequest.GetHttpRequestがTask<ElementType>を返すと仮定)あなたが作成したTask<ElementType>あります、そして物事がすべきことを知っていますうまくいく。

+0

を参照してください。だから、私はどのようなElementTypeがコンパイル時にわからないので、タスク変数をタスクにキャストするのですか? –

+0

実際にタスクタイプのため、キャストできません。あなたはGetResultの最後にあなたの仕事を待っているので、結果は失われています。待つことなくGetResultのタスクを返すだけです(なぜでしょうか?)。 – Evk

関連する問題