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



我在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。我怎么得到这个值呢?

我可以得到该字段的FieldInfo,但我试图通过fieldInfo.GetValue(null)获得它的值,它总是返回null。我怎么得到这个值呢?

您正在获取值。当您请求该字段的值时,该字段为空。Null是引用类型字段的合法值。

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

如果你想知道为什么字段是空的:字段在初始化之前是空的。你已经反编译了代码;您可以看到有一个测试字段值是否为空的分支。阅读代码的其余部分,看看哪些字段被赋给了一个非空值。

相关内容

  • 没有找到相关文章

最新更新