Roslyn是否可以获得编译器生成的lambda方法的名称?
例如想象下面的类:
public sealed class Foo
{
public void Bar()
{
Func<int, int> func = x =>
{
if (x > 0)
{
return x;
}
return -x;
};
}
}
生成以下代码:
public sealed class Foo
{
[CompilerGenerated]
[Serializable]
private sealed class <>c
{
public static readonly Foo.<>c <>9 = new Foo.<>c();
public static Func<int, int> <>9__0_0;
internal int <Bar>b__0_0(int x)
{
bool flag = x > 0;
int result;
if (flag)
{
result = x;
}
else
{
result = -x;
}
return result;
}
}
public void Bar()
{
Func<int, int> arg_20_0;
if ((arg_20_0 = Foo.<>c.<>9__0_0) == null)
{
Foo.<>c.<>9__0_0 = new Func<int, int>(Foo.<>c.<>9.<Bar>b__0_0);
}
}
}
Roslyn包含负责将lambda降级为具有不同策略的方法的代码,具体取决于具体情况(all here)。
但是,如果我有符号或SimpleLambdaExpressionSyntax节点,是否有任何简单的方法来获取名称Foo.<>c.<Bar>b__0_0
?
这显然是特定于实现的行为,因此这需要使用编译器使用的相同roslyn版本,但这是可以接受的。
答案 0 :(得分:1)
Roslyn API无法实现。您可以使用System.Reflection.Metadata之类的内容来读取IL并根据需要查找名称。但是应该说编译器生成的名称是一个实现细节,它们会改变。