{"record":{"id":"5aea78c2ffee39d3","repo":"dotnet/wpf","slug":"sr-format-sr-xamlmarkupextensionwriterduplicatemember","errorCode":null,"errorMessage":"SR.Format(SR.XamlMarkupExtensionWriterDuplicateMember, property.Name)","messagePattern":"SR\\.Format\\(SR\\.XamlMarkupExtensionWriterDuplicateMember, property\\.Name\\)","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"src/Microsoft.DotNet.Wpf/src/System.Xaml/System/Xaml/XamlMarkupExtensionWriter.cs","lineNumber":136,"sourceCode":"                    // the prefix is not found and curly syntax has no way of defining a prefix\n                    return string.Empty; // what we return here is not important, since Failed has set to be true\n                }\n            }\n\n            return prefix;\n        }\n\n        private void CheckMemberForUniqueness(Node objectNode, XamlMember property)\n        {\n            if (!settings.AssumeValidInput)\n            {\n                if (objectNode.Members is null)\n                {\n                    objectNode.Members = new XamlPropertySet();\n                }\n                else if (objectNode.Members.Contains(property))\n                {\n                    throw new InvalidOperationException(SR.Format(SR.XamlMarkupExtensionWriterDuplicateMember, property.Name));\n                }\n\n                objectNode.Members.Add(property);\n            }\n        }\n\n        public override void WriteStartObject(XamlType type)\n        {\n            currentState.WriteStartObject(this, type);\n        }\n\n        public override void WriteGetObject()\n        {\n            currentState.WriteGetObject(this);\n        }\n\n        public override void WriteEndObject()\n        {","sourceCodeStart":118,"sourceCodeEnd":154,"githubUrl":"https://github.com/dotnet/wpf/blob/81131a70a4c573cd62748a5c36908fc4d662daa9/src/Microsoft.DotNet.Wpf/src/System.Xaml/System/Xaml/XamlMarkupExtensionWriter.cs#L118-L154","documentation":"XamlMarkupExtensionWriter.CheckMemberForUniqueness tracks members written for the current object node in a XamlPropertySet; writing the same member twice throws InvalidOperationException with SR.XamlMarkupExtensionWriterDuplicateMember. Within a markup extension each property may be specified only once.","triggerScenarios":"A XAML node stream (or the producer building it) emits WriteStartMember/WriteEndMember for the same XamlProperty twice inside one markup-extension object, e.g. duplicate attributes in markup extension usage like {x:Static A=1, A=2}.","commonSituations":"Hand-written or generated XAML with a duplicated property in a markup extension; custom XAML writers that don't deduplicate members; code generators emitting both an explicit and default member assignment.","solutions":["Remove the duplicate property assignment in the markup extension usage so each property appears once.","Deduplicate members in your node-stream producer before writing (check objectNode.Members.Contains).","Catch InvalidOperationException in writer pipelines consuming untrusted XAML and surface a good parse error.","Fix the generator/serializer emitting the duplicated member."],"exampleFix":"// before\n// {MyExtension Value=1, Value=2}\n// after\n// {MyExtension Value=2}","handlingStrategy":"validation","validationCode":"var seen = new HashSet<XamlProperty>();\n// per object node, before each WriteStartMember(property):\nif (!seen.Add(property)) throw new InvalidOperationException($\"Duplicate member {property.Name} in markup extension.\");","typeGuard":null,"tryCatchPattern":"try { writer.WriteStartMember(property); } catch (InvalidOperationException ex) when (/* DuplicateMember */) { /* report duplicate property in the XAML source */ }","preventionTips":["Deduplicate markup extension attributes at parse time","Track written members per object node","Fix generators that emit a member twice"],"tags":["xaml","markup-extension","duplicate-member"],"backgroundTag":"invalid-state-transition","analyzedSha":"81131a70a4c573cd62748a5c36908fc4d662daa9","analyzedAt":"2026-09-14T10:12:48.479Z","contentChangedAt":"2026-09-14T10:12:48.479Z","schemaVersion":2},"datasetVersion":"2026-09-21T21:30:21.729Z"}