{"record":{"id":"f86dfedc27faddb8","repo":"JeffreySu/WeiXinMPSDK","slug":"responsemessagebase-createfromrequestmessage-t","errorCode":null,"errorMessage":"ResponseMessageBase.CreateFromRequestMessage<T>过程发生异常！","messagePattern":"ResponseMessageBase\\.CreateFromRequestMessage<T>过程发生异常！","errorType":"exception","errorClass":"WeixinException","httpStatus":null,"severity":"error","filePath":"src/Senparc.Weixin.Work/Senparc.Weixin.Work/Entities/Response/WorkResponseMessageBase.cs","lineNumber":116,"sourceCode":"\n\t\t/// <summary>\n\t\t/// 获取响应类型实例，并初始化\n\t\t/// </summary>\n\t\t/// <typeparam name=\"T\">需要返回的类型</typeparam>\n\t\t/// <param name=\"requestMessage\">请求数据</param>\n\t\t/// <returns></returns>\n\t\tpublic static T CreateFromRequestMessage<T>(IWorkRequestMessageBase requestMessage) where T : WorkResponseMessageBase\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tvar tType = typeof(T);\n\t\t\t\tvar responseName = tType.Name.Replace(\"ResponseMessage\", \"\"); //请求名称\n\t\t\t\tResponseMsgType msgType = (ResponseMsgType)Enum.Parse(typeof(ResponseMsgType), responseName);\n\t\t\t\treturn CreateFromRequestMessage(requestMessage, msgType) as T;\n\t\t\t}\n\t\t\tcatch (Exception ex)\n\t\t\t{\n\t\t\t\tthrow new WeixinException(\"ResponseMessageBase.CreateFromRequestMessage<T>过程发生异常！\", ex);\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 从返回结果XML转换成IResponseMessageBase实体类\n\t\t/// </summary>\n\t\t/// <param name=\"xml\">返回给服务器的Response Xml</param>\n\t\t/// <returns></returns>\n\t\tpublic static IWorkResponseMessageBase CreateFromResponseXml(string xml)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tif (string.IsNullOrEmpty(xml))\n\t\t\t\t{\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\tvar doc = XDocument.Parse(xml);","sourceCodeStart":98,"sourceCodeEnd":134,"githubUrl":"https://github.com/JeffreySu/WeiXinMPSDK/blob/be573f6f94bdbf718dd5f6cdecb137fbc7ff651e/src/Senparc.Weixin.Work/Senparc.Weixin.Work/Entities/Response/WorkResponseMessageBase.cs#L98-L134","documentation":"The generic CreateFromRequestMessage<T>() derives the ResponseMsgType from the type name of T (by stripping 'ResponseMessage' and parsing an enum), then delegates to the non-generic factory. Any exception in that flow — invalid enum name derived from T, unmapped msg type, or population failure — is rethrown as a WeixinException with this message and the original exception as InnerException.","triggerScenarios":"Calling CreateFromRequestMessage<SomeResponseMessage>() where the class name minus 'ResponseMessage' does not match a ResponseMsgType enum member, or where the underlying factory throws (e.g. null requestMessage, unmapped type).","commonSituations":"Custom or renamed response entity classes whose names no longer map to enum members; passing null requestMessage; SDK version drift between entity classes and enum values.","solutions":["Ensure T's class name matches the pattern ResponseMessage<EnumName> and that EnumName is a valid ResponseMsgType member, or use the non-generic overload with an explicit msgType","Null-check requestMessage before the call","Catch WeixinException and inspect InnerException for the underlying error"],"exampleFix":"// before\nvar msg = WorkResponseMessageBase.CreateFromRequestMessage<MyCustomResponse>(requestMessage);\n// after\nvar msg = WorkResponseMessageBase.CreateFromRequestMessage(requestMessage, ResponseMsgType.Text);","handlingStrategy":"try-catch","validationCode":"var name = typeof(T).Name.Replace(\"ResponseMessage\", \"\");\nif (!Enum.IsDefined(typeof(ResponseMsgType), name))\n    throw new InvalidOperationException($\"{typeof(T).Name} does not map to a ResponseMsgType\");","typeGuard":"static bool TypeMapsToResponseMsgType<T>() where T : WorkResponseMessageBase =>\n    Enum.IsDefined(typeof(ResponseMsgType), typeof(T).Name.Replace(\"ResponseMessage\", \"\"));","tryCatchPattern":"try { var msg = WorkResponseMessageBase.CreateFromRequestMessage<T>(requestMessage); }\ncatch (WeixinException ex) { log.Error(ex.Message, ex.InnerException); throw; }","preventionTips":["Name response entity classes strictly as ResponseMessage<EnumMemberName>","Prefer the non-generic overload with an explicit ResponseMsgType for custom types","Verify requestMessage is non-null and deserialized before the factory call"],"tags":["generic-factory","enum-parsing","exception-wrapper"],"backgroundTag":"invalid-enum-value","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"}