{"record":{"id":"f4302240c0af1589","repo":"babalae/better-genshin-impact","slug":"fieldname-value-typeof-tenum-name","errorCode":null,"errorMessage":"{fieldName} 的值 {value} 不是有效的 {typeof(TEnum).Name}","messagePattern":"(.+?) 的值 (.+?) 不是有效的 (.+?)","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"BetterGenshinImpact/Core/Recognition/RecognitionObjectJsonLoader.cs","lineNumber":506,"sourceCode":"                3 => new Scalar(values[0], values[1], values[2]),\n                4 => new Scalar(values[0], values[1], values[2], values[3]),\n                _ => throw new InvalidOperationException($\"{fieldName} 必须是 1 到 4 个数字\"),\n            };\n        }\n\n        private static TEnum ParseEnumExact<TEnum>(string? value, string fieldName) where TEnum : struct, Enum\n        {\n            if (string.IsNullOrWhiteSpace(value))\n            {\n                throw new InvalidOperationException($\"{fieldName} 不能为空\");\n            }\n\n            if (Enum.TryParse<TEnum>(value, false, out var parsed))\n            {\n                return parsed;\n            }\n\n            throw new InvalidOperationException($\"{fieldName} 的值 {value} 不是有效的 {typeof(TEnum).Name}\");\n        }\n\n        private static Color ParseColor(string value)\n        {\n            return ColorTranslator.FromHtml(value);\n        }\n\n        private static double ToDouble(object? value)\n        {\n            return value switch\n            {\n                null => 0d,\n                byte byteValue => byteValue,\n                short shortValue => shortValue,\n                int intValue => intValue,\n                long longValue => longValue,\n                float floatValue => floatValue,\n                double doubleValue => doubleValue,","sourceCodeStart":488,"sourceCodeEnd":524,"githubUrl":"https://github.com/babalae/better-genshin-impact/blob/a7cb36712dcb409be610257d877fcea3597e9d6b/BetterGenshinImpact/Core/Recognition/RecognitionObjectJsonLoader.cs#L488-L524","documentation":"ParseEnumExact uses Enum.TryParse with case-sensitivity enabled (the false argument), so the JSON value must exactly match the enum member name. If casing differs or the name is not a member, InvalidOperationException is thrown naming the field, the bad value, and the target enum type.","triggerScenarios":"A JSON enum field uses wrong casing or a non-existent member, e.g. \"ocrEngine\": \"paddleocr\" instead of \"PaddleOcr\", or \"type\": \"templatematch\" instead of \"TemplateMatch\".","commonSituations":"Lowercase or differently-cased value; typo; enum member renamed in code but JSON not updated; copied value from documentation with different casing.","solutions":["Match the exact member name and casing from the enum definition (RecognitionTypes, OcrEngineTypes, ImreadModes, TemplateMatchModes, ColorConversionCodes, SearchAnchorMode).","Check the enum source for the valid members after a rename.","Update stale JSON values when an enum member is renamed."],"exampleFix":"// before\n// \"ocrEngine\": \"paddleocr\"  -> case mismatch -> throws\n\n// after\n// \"ocrEngine\": \"PaddleOcr\"","handlingStrategy":"type-guard","validationCode":"static bool IsValidEnum<TEnum>(string? value) where TEnum : struct, Enum\n    => !string.IsNullOrWhiteSpace(value) && Enum.TryParse<TEnum>(value, false, out _);\n\nforeach (var (name, cfg) in config.Objects)\n{\n    if (!IsValidEnum<RecognitionTypes>(cfg.Type))\n        throw new InvalidOperationException($\"Object '{name}' type '{cfg.Type}' is not a valid RecognitionTypes member (exact case).\");\n}","typeGuard":"static bool IsValidEnumMember<TEnum>(string? value) where TEnum : struct, Enum\n    => value is not null && Enum.IsDefined(typeof(TEnum), value);","tryCatchPattern":"try { return RecognitionObjectJsonLoader.Load(config, objectName, context); }\ncatch (InvalidOperationException ex) when (ex.Message.Contains(\"不是有效的\"))\n{ Logger.LogError(ex, \"Enum field has invalid value/casing.\"); throw; }","preventionTips":["Match enum member names exactly (case-sensitive) as defined in code.","After renaming an enum member, sweep all Recognition.json files for the old value.","Use a schema/autocomplete in the JSON editor constrained to the real enum members."],"tags":["config","enum","validation","case-sensitivity"],"backgroundTag":null,"analyzedSha":"a7cb36712dcb409be610257d877fcea3597e9d6b","analyzedAt":"2026-08-13T16:44:57.548Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}