{"record":{"id":"9cf7c1cad45c2326","repo":"JeffreySu/WeiXinMPSDK","slug":"buttongroupbase","errorCode":null,"errorMessage":"buttonGroupBase不可以为空！","messagePattern":"buttonGroupBase不可以为空！","errorType":"validation","errorClass":"ArgumentNullException","httpStatus":null,"severity":"error","filePath":"src/Senparc.Weixin.MP/Senparc.Weixin.MP/CommonAPIs/Menu/CommonApi.Menu.Common.cs","lineNumber":425,"sourceCode":"                            throw new WeixinMenuException(\"菜单类型无法处理（二级菜单）：\" + subSubButton.type);\n                        }\n                    }\n                }\n            }\n        }\n\n        /// <summary>\n        /// 根据微信返回的Json数据得到可用的GetMenuResult结果\n        /// </summary>\n        /// <param name=\"resultFull\"></param>\n        /// <param name=\"buttonGroupBase\">ButtonGroupBase的衍生类型，可以为ButtonGroup或ConditionalButtonGroup。返回的GetMenuResult中的menu属性即为此示例。</param>\n        /// <returns></returns>\n        public static GetMenuResult GetMenuFromJsonResult(GetMenuResultFull resultFull, ButtonGroupBase buttonGroupBase)\n        {\n            GetMenuResult result = null;\n            if (buttonGroupBase == null)\n            {\n                throw new ArgumentNullException(\"buttonGroupBase不可以为空！\");\n            }\n\n            try\n            {\n                //重新整理按钮信息\n                ButtonGroupBase buttonGroup = buttonGroupBase; // ?? new ButtonGroup();\n                var rootButtonList = resultFull.menu.button;\n\n                GetButtonGroup(rootButtonList, buttonGroup);//设置默认菜单\n                result = new GetMenuResult(buttonGroupBase)\n                {\n                    menu = buttonGroup,\n                    //conditionalmenu = resultFull.conditionalmenu\n                };\n\n                //设置个性化菜单列表\n                if (resultFull.conditionalmenu != null)\n                {","sourceCodeStart":407,"sourceCodeEnd":443,"githubUrl":"https://github.com/JeffreySu/WeiXinMPSDK/blob/be573f6f94bdbf718dd5f6cdecb137fbc7ff651e/src/Senparc.Weixin.MP/Senparc.Weixin.MP/CommonAPIs/Menu/CommonApi.Menu.Common.cs#L407-L443","documentation":"Thrown by GetMenuFromJsonResult in Senparc.Weixin.MP's menu CommonApi when the buttonGroupBase parameter is null. GetMenu calls this helper to convert the raw JSON returned by WeChat into a usable GetMenuResult, and it passes a pre-created ButtonGroup or ConditionalButtonGroup instance as the target container; if that container was not supplied (null), conversion cannot proceed, so a WeixinMenuException is raised. The fault lies with the caller passing a null button group, not with the WeChat response itself.","triggerScenarios":"Calling GetMenuFromJsonResult (directly or via GetMenu overloads) passing null as the buttonGroupBase argument.","commonSituations":"Custom ButtonGroupBase subclasses instantiated conditionally (DI returning null), copy-pasted calls that dropped the new ButtonGroup() argument.","solutions":["Pass a concrete ButtonGroupBase instance, e.g. new ButtonGroup(), or your custom subclass","Fix the DI/factory that was expected to supply the button group but returned null","If you call GetMenu, use an overload that constructs the default button group for you"],"exampleFix":"// before\nvar menu = CommonApi.GetMenuFromJsonResult(resultFull, null);\n// after\nvar menu = CommonApi.GetMenuFromJsonResult(resultFull, new ButtonGroup());","handlingStrategy":"type-guard","validationCode":"if (buttonGroupBase is null)\n    throw new ArgumentNullException(nameof(buttonGroupBase), \"Pass new ButtonGroup() or a custom ButtonGroupBase\");","typeGuard":"static T RequireNotNull<T>(T? value) where T : class => value ?? throw new ArgumentNullException(nameof(value));\n// usage: GetMenuFromJsonResult(resultFull, RequireNotNull(buttonGroupBase));","tryCatchPattern":"try\n{\n    var menu = CommonApi.GetMenuFromJsonResult(resultFull, buttonGroupBase);\n}\ncatch (ArgumentNullException ex)\n{\n    logger.LogError(ex, \"buttonGroupBase was null\");\n}","preventionTips":["Never pass a possibly-null ButtonGroupBase from DI without a null check","Default to new ButtonGroup() when no custom group is needed","Use nullable reference types so the compiler flags null arguments","Prefer GetMenu overloads that construct the group internally"],"tags":["weixin","menu","null-argument"],"backgroundTag":"null-argument","analyzedSha":"be573f6f94bdbf718dd5f6cdecb137fbc7ff651e","analyzedAt":"2026-09-12T10:01:50.733Z","contentChangedAt":"2026-09-12T10:01:50.733Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}