我们如何通过反射获得编译器生成的字段值?

时间:2015-10-07 16:08:02

标签: c# reflection

我在C#中有一个函数,它创建了一个lambda委托:

static public class PortableDemo
{
    static public void PortableKernel(int offset)
    {
        PortableUtil.Foo(() => Console.WriteLine("1"));
    }

我分析了IL代码,它看起来像:

IsStatic: true
             00000000 nop             
             00000001 ldsfld          System.Action <>9__0_0
             00000006 dup             
             00000007 brtrue.s        L_0020 /* = 32 (rel.: 23) */
             00000009 pop             

因此,它会加载一个名为<>9__0_0的静态字段。这是一个编译器生成的字段,从dotPeek,我可以确认它是灰色的(表示编译器生成的私有字段)。

现在问题是,我可以获得该字段的FieldInfo,但我尝试通过fieldInfo.GetValue(null)获取它的值,并且它始终返回null。那么我怎样才能获得这个价值呢?

1 个答案:

答案 0 :(得分:4)

  

我可以获得该字段的FieldInfo,但我尝试通过fieldInfo.GetValue(null)获取它的值,并且它始终返回null。那么我怎样才能获得这个价值呢?

你正在获得价值。在询问字段值时,该字段为空。 Null是引用类型字段的合法值。

您在这里看到的是编译器生成的字段,它是一个实现细节;该字段不需要具有在任何特定时间对您有任何特定用途的任何特定值。你不应该碰它。

如果您想知道字段为空的原因:在初始化字段之前,字段为空。你已经反编译了代码;你可以看到有一个分支测试无效的字段值。阅读其余代码,查看字段分配给非空值的位置。在需要之前,该字段不会被初始化。