短いMoveNext()
:メソッドが与えられたら、これを試してください:
private static MethodBase GetRealMethodFromAsyncMethod(MethodBase asyncMethod)
{
var generatedType = asyncMethod.DeclaringType;
var originalType = generatedType.DeclaringType;
var matchingMethods =
from methodInfo in originalType.GetMethods()
let attr = methodInfo.GetCustomAttribute<AsyncStateMachineAttribute>()
where attr != null && attr.StateMachineType == generatedType
select methodInfo;
// If this throws, the async method scanning failed.
var foundMethod = matchingMethods.Single();
return foundMethod;
}
ロング (免責事項)
これを本番環境で使用しないでください。これはコンパイラの動作に依存しており、将来のバージョンでは予告なく変更される可能性があります。コンパイラに関する次の仮定が行われます。
- 実際に実行中の非同期メソッドは、生成された型の内部で生成されます。
- 生成された型は、元の手書きのメソッドを含む元の型の入れ子になった型です。
- 元のメソッドは、コンパイラによって生成された属性 AsyncStateMachine を取得し、生成された型が提供されます。
私のコードで動作し、デバッグ/テスト中の実行時コード分析にのみ使用します。繰り返しますが、製品コードでは使用しないでください。