【发布时间】:2014-12-31 09:25:24
【问题描述】:
我想获取带有 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
}
}
【问题讨论】:
-
不清楚你所说的“漂亮的印刷品”是什么意思。您期望的输出是什么?
-
我想得到方法名和它的参数。
-
目标是打印:Program.Test(a, b)
-
但是你刚刚得到了调用方法的结果。虽然您可以通过尝试将类型的名称与方法匹配来做到这一点,但您必须考虑如果方法重载会发生什么 - 以及您想要做什么如果该方法的实现更改为以后不使用迭代器块。 (假设您决定改用 LINQ,例如...)
-
我使用迭代的方法来实现协程。这个漂亮的打印将允许以与普通调用堆栈相同的方式获取异步调用堆栈。我想我应该用一些正则表达式来进行上述反思......
标签: c# visual-studio yield coroutine object-dumper