从lambda获取降低的函数名称

时间:2017-02-28 15:38:28

标签: c# lambda code-generation roslyn

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版本,但这是可以接受的。

1 个答案:

答案 0 :(得分:1)

Roslyn API无法实现。您可以使用System.Reflection.Metadata之类的内容来读取IL并根据需要查找名称。但是应该说编译器生成的名称是一个实现细节,它们会改变。