を知らなくても、他のタスクにタスクをチェーンでください新しいタスクの結果が最初のタスクの結果になるように、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を記述された方法で使用します。
になります。実際の状況は一言:タスクを返すAPI(メソッド群)があります。 TResultは、すべてのメソッドで異なる場合があります。私は、そのAPIを実装するオブジェクトへの呼び出しをログに記録できるソリューションを設計する必要があります。私はこれが一面の仕事だと思った。その側面をフックアップするために私はUnityの傍受を使います。したがって、インターセプタは、APIによって返された元のタスクに継続を作成します。この継続では、ロギングの側面を実装しました。次に、インターセプタは、呼び出し元サイトが期待するものを返す必要があります。 –
ここで、TResultは元のタスクの実際の結果です。なぜあなたは尋ねましたか?これは、インターセプタでは、結果がIMethodReturn.ReturnValueのインスタンスを介して 'オブジェクト'に存在するためです。または、まだ何かが欠けていますか? –
@ ay.metallo:そうです。それは意味があります。あなたは無意味な仕事のように見えるものを提示するとき、なぜそれが本当に無意味ではないのかを常に説明しています。 –