public void EmitExtract(IBlockContext context, List <IBlockVariable> targetVariables) { IBlockVariable target = targetVariables[0]; Type generatedType = optionType.GeneratedType(context.ModuleContext); context.IL.Emit(OpCodes.Dup); context.IL.Emit(OpCodes.Ldfld, generatedType.GetField("defined")); if (target == null) { context.IL.Emit(OpCodes.Pop); } else { LabelRef onUndefined = context.IL.DefineLabel(true); LabelRef end = context.IL.DefineLabel(true); context.IL.Emit(OpCodes.Brfalse_S, onUndefined); context.IL.Emit(OpCodes.Ldfld, generatedType.GetField("value")); target.EmitStore(context); context.IL.Emit(OpCodes.Ldc_I4_1); context.IL.Emit(OpCodes.Br_S, end); context.IL.MarkLabel(onUndefined); context.IL.Emit(OpCodes.Pop); context.IL.Emit(OpCodes.Ldc_I4_0); context.IL.MarkLabel(end); } }