0

を知らなくても、他のタスクにタスクをチェーンでください新しいタスクの結果が最初のタスクの結果になるように、CreateTask関数によって返されたタスクにチェーンされた別のタスク。私。このような何か:は、どのように私はオブジェクトとしてタスクを返すAPIを持っていると仮定し、最初のタスクの結果の型

private static object WrapTask(dynamic task) 
    { 
     object new_task = task.ContinueWith(parentTask => parentTask.Result, TaskContinuationOptions.ExecuteSynchronously); 

     return new_task; 
    } 

の使用サンプル:

 var task = (Task<string>)WrapTask(CreateTask()); 

     Console.WriteLine(task.Result); 

は、 "タスクの文字列" の文字列を印刷するようになっています。

WrapTask機能に問題がコンパイラはこのような構成を受け入れることを拒否していることである:次のエラーで

 object result = task.ContinueWith(parentTask => parentTask.Result, TaskContinuationOptions.ExecuteSynchronously); 

 Cannot use a lambda expression as an argument to a dynamically dispatched operation without first casting it to a delegate or expression tree type 

は、拡張については移動する方法上の任意のアイデアをお願い申し上げますAPIを記述された方法で使用します。

答えて

2

あなたは動的型付けが提供する型推論とジェネリックメソッドを呼び出すために、動的型付けを使用することができます。

private static object WrapTask(dynamic task) 
{ 
    return WrapTaskImpl(task); 
} 

private static Task<T> WrapTaskImpl<T>(Task<T> task) 
{ 
    return task.ContinueWith(parentTask => parentTask.Result, 
     TaskContinuationOptions.ExecuteSynchronously); 
} 

それは、このラッピングのポイントはあなたを気に、何であるかは全く明らかではありません...でも、なぜの結果をWrapTaskにキャストしたい場合は、それがタスクであることが分かっている場合は、代わりにCreateTaskの結果をキャストしてください。その時点でWrapTaskと簡単に電話できますか?あるいは、WrapTaskにキャスティング自体を実行させることができますか?

private static Task<T> WrapTask<T>(object task) 
{ 
    Task<T> realTask = (Task<T>) task; 
    return realTask.ContinueWith(parentTask => parentTask.Result, 
           TaskContinuationOptions.ExecuteSynchronously); 
} 

次に、あなたの呼び出し元のコードは、上記のAPIが簡素化され

var task = WrapTask<string>(CreateTask()); 

Console.WriteLine(task.Result); 
+0

になります。実際の状況は一言:タスクを返すAPI(メソッド群)があります。 TResultは、すべてのメソッドで異なる場合があります。私は、そのAPIを実装するオブジェクトへの呼び出しをログに記録できるソリューションを設計する必要があります。私はこれが一面の仕事だと思った。その側面をフックアップするために私はUnityの傍受を使います。したがって、インターセプタは、APIによって返された元のタスクに継続を作成します。この継続では、ロギングの側面を実装しました。次に、インターセプタは、呼び出し元サイトが期待するものを返す必要があります。

+0

ここで、TResultは元のタスクの実際の結果です。なぜあなたは尋ねましたか?これは、インターセプタでは、結果がIMethodReturn.ReturnValueのインスタンスを介して 'オブジェクト'に存在するためです。または、まだ何かが欠けていますか? –

+0

@ ay.metallo:そうです。それは意味があります。あなたは無意味な仕事のように見えるものを提示するとき、なぜそれが本当に無意味ではないのかを常に説明しています。 –

関連する問題