{"record":{"id":"0960634ef4fbb6e0","repo":"babalae/better-genshin-impact","slug":"js-array-getcharacter","errorCode":null,"errorMessage":"多角色接口需要字符串集合或 JS Array，单个字符串请使用 GetCharacter。","messagePattern":"多角色接口需要字符串集合或 JS Array，单个字符串请使用 GetCharacter。","errorType":"validation","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"BetterGenshinImpact/GameTask/CharacterDevelopment/CharacterDevelopmentTask.cs","lineNumber":122,"sourceCode":"    /// <summary>\n    /// 获取多个角色的信息。兼容 C# 字符串集合以及实现 <see cref=\"IList\"/> 的 ClearScript JS Array。\n    /// </summary>\n    /// <param name=\"characterNames\">目标角色名集合。</param>\n    /// <param name=\"categories\">使用分号分隔的分类：属性、武器、天赋；null 表示全部。</param>\n    public async Task<List<CharacterDevelopmentResult>> GetMultiCharacters(object characterNames, string? categories = null)\n    {\n        var names = ParseCharacterNames(characterNames);\n        var categoryFlags = ParseCategories(categories);\n        return await new CharacterDevelopmentStateMachineTask(names, categoryFlags)\n            .Start(CancellationContext.Instance.Cts.Token);\n    }\n\n    internal static List<string> ParseCharacterNames(object characterNames)\n    {\n        ArgumentNullException.ThrowIfNull(characterNames);\n        if (characterNames is string)\n        {\n            throw new ArgumentException(\"多角色接口需要字符串集合或 JS Array，单个字符串请使用 GetCharacter。\", nameof(characterNames));\n        }\n\n        if (characterNames is not IEnumerable enumerable)\n        {\n            throw new ArgumentException(\"角色名参数必须是字符串集合或 JS Array。\", nameof(characterNames));\n        }\n\n        List<string> names = [];\n        foreach (var item in enumerable)\n        {\n            if (item is not string name)\n            {\n                throw new ArgumentException(\"角色名集合中的每个元素都必须是字符串。\", nameof(characterNames));\n            }\n\n            names.Add(NormalizeCharacterName(name));\n        }\n","sourceCodeStart":104,"sourceCodeEnd":140,"githubUrl":"https://github.com/babalae/better-genshin-impact/blob/a7cb36712dcb409be610257d877fcea3597e9d6b/BetterGenshinImpact/GameTask/CharacterDevelopment/CharacterDevelopmentTask.cs#L104-L140","documentation":"Thrown by ParseCharacterNames (called from GetMultiCharacters) when the characterNames argument is a single string rather than a collection. GetMultiCharacters is designed for multiple characters and accepts string collections or JS Arrays; a single string should use GetCharacter instead. This is an argument-type contract violation.","triggerScenarios":"Called from GetMultiCharacters(characterNames, categories) → ParseCharacterNames(characterNames). characterNames is of runtime type string (e.g. passed from JS as a plain string instead of an array).","commonSituations":"JavaScript caller passes a single character name string instead of wrapping it in an array; C# caller mistakenly passes a string to the multi-character API; confusion between GetCharacter (single) and GetMultiCharacters (plural).","solutions":["Use GetCharacter(characterName) for a single character instead of GetMultiCharacters.","If using GetMultiCharacters, wrap the name in an array: ['CharacterName'].","From JavaScript, ensure you pass an Array (e.g. ['钟离']) not a bare string."],"exampleFix":"// before (wrong)\nawait dev.GetMultiCharacters('钟离');\n// after (single character)\nawait dev.GetCharacter('钟离');\n// after (multi-character API with array)\nawait dev.GetMultiCharacters(['钟离']);","handlingStrategy":"validation","validationCode":"// Before calling GetMultiCharacters, check the argument type\nif (characterNames is string)\n{\n    // Use GetCharacter for a single string\n    return await task.GetCharacter((string)characterNames);\n}\nif (characterNames is not IEnumerable)\n{\n    throw new ArgumentException(\"characterNames must be a string collection or JS Array.\");\n}","typeGuard":"static bool IsCharacterNameCollection(object obj)\n{\n    return obj is not string && obj is IEnumerable;\n}","tryCatchPattern":"try\n{\n    await dev.GetMultiCharacters(names);\n}\ncatch (ArgumentException ex) when (ex.Message.Contains(\"多角色接口\"))\n{\n    // Switch to GetCharacter or wrap in an array\n}","preventionTips":["Use GetCharacter for single character names; GetMultiCharacters for arrays.","From JavaScript, always pass an Array, not a bare string.","Type-check the argument before calling the multi-character API."],"tags":["character-development","argument-validation","api-contract","javascript-interop"],"backgroundTag":null,"analyzedSha":"a7cb36712dcb409be610257d877fcea3597e9d6b","analyzedAt":"2026-08-13T16:44:57.548Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}