{"record":{"id":"819b50410eabd199","repo":"stride3d/stride","slug":"failed-to-get-objectdescriptor-for-type-type-fullname-the","errorCode":null,"errorMessage":"Failed to get ObjectDescriptor for type [{Type.FullName}]. The member [{member}] cannot be registered as a member with the same name [{alternateName}] is already registered [{existingMember}]","messagePattern":"Failed to get ObjectDescriptor for type \\[(.+?)\\]\\. The member \\[(.+?)\\] cannot be registered as a member with the same name \\[(.+?)\\] is already registered \\[(.+?)\\]","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"sources/core/Stride.Core.Reflection/TypeDescriptors/ObjectDescriptor.cs","lineNumber":166,"sourceCode":"        mapMembers = new Dictionary<string, IMemberDescriptor>(members.Length);\n\n        foreach (var member in members)\n        {\n            if (mapMembers.TryGetValue(member.Name, out var existingMember))\n            {\n                throw new InvalidOperationException(\"Failed to get ObjectDescriptor for type [{0}]. The member [{1}] cannot be registered as a member with the same name is already registered [{2}]\".ToFormat(Type.FullName, member, existingMember));\n            }\n\n            mapMembers.Add(member.Name, member);\n\n            // If there is any alternative names, register them\n            if (member.AlternativeNames != null)\n            {\n                foreach (var alternateName in member.AlternativeNames)\n                {\n                    if (mapMembers.TryGetValue(alternateName, out existingMember))\n                    {\n                        throw new InvalidOperationException($\"Failed to get ObjectDescriptor for type [{Type.FullName}]. The member [{member}] cannot be registered as a member with the same name [{alternateName}] is already registered [{existingMember}]\");\n                    }\n                    remapMembers ??= [];\n\n                    mapMembers[alternateName] = member;\n                    remapMembers.Add(alternateName);\n                }\n            }\n        }\n    }\n\n    public bool Contains(string memberName)\n    {\n        return mapMembers?.ContainsKey(memberName) == true;\n    }\n\n    protected virtual List<IMemberDescriptor> PrepareMembers()\n    {\n        if (Type == typeof(Type))","sourceCodeStart":148,"sourceCodeEnd":184,"githubUrl":"https://github.com/stride3d/stride/blob/96fad776d210c221682aac1ccdf4c79dc046fc38/sources/core/Stride.Core.Reflection/TypeDescriptors/ObjectDescriptor.cs#L148-L184","documentation":"ObjectDescriptor.Initialize also registers each member's AlternativeNames (alias names accepted during deserialization). If an alternate name collides with an already-registered member name (or another alias), registration would be ambiguous and Initialize throws InvalidOperationException naming the type, member, colliding alternate name, and existing member.","triggerScenarios":"A member declares AlternativeNames containing a string equal to another member's name, another member's alias, or its own sibling alias; raised while building the ObjectDescriptor for that type.","commonSituations":"Merging legacy serialized names after a rename (e.g. alias 'oldName' that matches a still-present property); mass renames where the old name was kept as a field; aliases auto-generated per naming convention colliding with actual member names.","solutions":["Remove or rename the conflicting AlternativeName entry on the member.","Ensure aliases are unique across all members of the type (including real member names).","If the alias was meant to support old data migration, delete or rename the member now occupying that name."],"exampleFix":"// before\nmember.AlternativeNames = [\"Name\", \"Name\"];\n// after\nmember.AlternativeNames = [\"Name\", \"LegacyName\"];","handlingStrategy":"validation","validationCode":"var all = new HashSet<string>(StringComparer.Ordinal);\nforeach (var m in type.GetMembers().Where(m => m is FieldInfo or PropertyInfo))\n{\n    if (!all.Add(m.Name)) throw new InvalidOperationException($\"Alias {m.Name} collides\");\n    foreach (var a in GetAlternativeNames(m))\n        if (!all.Add(a)) throw new InvalidOperationException($\"Alias {a} collides\");\n}","typeGuard":null,"tryCatchPattern":"try { var desc = TypeDescriptorFactory.Default.FindDescriptor(type); }\ncatch (InvalidOperationException ex) when (ex.Message.Contains(\"AlternativeNames\") || ex.Message.Contains(\"alternateName\")) { log.LogError(ex, \"Alias collision on {Type}\", type); }","preventionTips":["Keep AlternativeNames disjoint from all member names and other aliases.","Review alias lists after renames/migrations to remove stale entries.","Automate an alias-uniqueness check over serializable types in tests."],"tags":["reflection","duplicate-member","serialization","csharp"],"backgroundTag":"internal-invariant-violation","analyzedSha":"96fad776d210c221682aac1ccdf4c79dc046fc38","analyzedAt":"2026-09-14T02:59:31.279Z","contentChangedAt":"2026-09-14T02:59:31.279Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}