Iterator Method の引数を使用してメソッド名を取得したいのですが、簡単な解決策を見つけるのに苦労しています。イテレータはコンパイラによって生成されます。その結果、ソース メソッド名とその引数が、生成されたクラス名とフィールドにそれぞれ含まれるようになりました (魔法の <>+_d シンボルを使用)。
Visual Studio のイミディエイト ウィンドウで、イテレータ メソッドを入力すると、メソッド名とその引数が適切な方法で取得されます。彼らはいくつかのカスタムプリンターを使用していますか、それともそれを行うためのヘルパーがいますか?
編集:
主な目標は、コルーチンの非同期コール スタックを取得することです。
Program.Test(a, b)
Program.TestB(b)
次に例を示します。
using System;
using System.Collections;
using System.Linq;
class Program
{
static IEnumerable TestB(string b)
{
yield return b;
yield return b;
}
static IEnumerable Test(string a, string b)
{
yield return a;
yield return TestB(b);
}
static void Main(string[] args)
{
var iterator = Test("foo", "bar");
// Immediate Window
// ================
// iterator
// {Program.Test}
// a: null
// b: null
// System.Collections.Generic.IEnumerator<System.Object>.Current: null
// System.Collections.IEnumerator.Current: null
Console.WriteLine(iterator);
// prints:
// Program+<Test>d__0
foreach (var field in iterator.GetType().GetFields())
Console.WriteLine(field);
// prints:
// System.String a
// System.String <>3__a
// System.String b
// System.String <>3__b
}
}