我在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
。那么我怎样才能获得这个价值呢?
答案 0 :(得分:4)
我可以获得该字段的
FieldInfo
,但我尝试通过fieldInfo.GetValue(null)
获取它的值,并且它始终返回null
。那么我怎样才能获得这个价值呢?
你正在获得价值。在询问字段值时,该字段为空。 Null是引用类型字段的合法值。
您在这里看到的是编译器生成的字段,它是一个实现细节;该字段不需要具有在任何特定时间对您有任何特定用途的任何特定值。你不应该碰它。
如果您想知道字段为空的原因:在初始化字段之前,字段为空。你已经反编译了代码;你可以看到有一个分支测试无效的字段值。阅读其余代码,查看字段分配给非空值的位置。在需要之前,该字段不会被初始化。