{"record":{"id":"a5e4a346174c6293","repo":"dotnet/wpf","slug":"sr-format-sr-markupextensionnocontext-gettype-name-nameof","errorCode":null,"errorMessage":"SR.Format(SR.MarkupExtensionNoContext, GetType().Name, nameof(IXamlTypeResolver))","messagePattern":"SR\\.Format\\(SR\\.MarkupExtensionNoContext, GetType\\(\\)\\.Name, nameof\\(IXamlTypeResolver\\)\\)","errorType":"exception","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"src/Microsoft.DotNet.Wpf/src/System.Xaml/System/Windows/Markup/StaticExtension.cs","lineNumber":84,"sourceCode":"                if (dotIndex < 0)\n                {\n                    throw new ArgumentException(SR.Format(SR.MarkupExtensionBadStatic, _member));\n                }\n\n                // Pull out the type substring (this will include any XML prefix, e.g. \"av:Button\")\n                string typeString = _member.Substring(0, dotIndex);\n                if (string.IsNullOrEmpty(typeString))\n                {\n                    throw new ArgumentException(SR.Format(SR.MarkupExtensionBadStatic, _member));\n                }\n\n                // Get the IXamlTypeResolver from the service provider\n\n                ArgumentNullException.ThrowIfNull(serviceProvider);\n\n                if (serviceProvider.GetService(typeof(IXamlTypeResolver)) is not IXamlTypeResolver xamlTypeResolver)\n                {\n                    throw new ArgumentException(SR.Format(SR.MarkupExtensionNoContext, GetType().Name, nameof(IXamlTypeResolver)));\n                }\n\n                // Use the type resolver to get a Type instance.\n                type = xamlTypeResolver.Resolve(typeString);\n\n                // Get the member name substring.\n                fieldString = _member.Substring(dotIndex + 1, _member.Length - dotIndex - 1);\n                if (string.IsNullOrEmpty(typeString))\n                {\n                    throw new ArgumentException(SR.Format(SR.MarkupExtensionBadStatic, _member));\n                }\n            }\n\n            // Use the built-in parser for enum types.\n            if (type.IsEnum)\n            {\n                return Enum.Parse(type, fieldString);\n            }","sourceCodeStart":66,"sourceCodeEnd":102,"githubUrl":"https://github.com/dotnet/wpf/blob/81131a70a4c573cd62748a5c36908fc4d662daa9/src/Microsoft.DotNet.Wpf/src/System.Xaml/System/Windows/Markup/StaticExtension.cs#L66-L102","documentation":"StaticExtension.ProvideValue needs an IXamlTypeResolver service from the serviceProvider to convert the type string (possibly with an XML prefix like 'av:Button') into a Type. If the provider returns null for typeof(IXamlTypeResolver), the extension throws MarkupExtensionNoContext, meaning it was evaluated in a context that cannot resolve XAML types.","triggerScenarios":"Calling ProvideValue with a service provider that does not offer IXamlTypeResolver — e.g. calling ProvideValue(new ServiceProvider()) manually, or using the extension outside a XAML parser load path.","commonSituations":"Unit tests invoking ProvideValue with a stub service provider lacking IXamlTypeResolver; runtime code that instantiates markup extensions directly outside XAML parsing; custom host frameworks that don't register the type resolver service.","solutions":["Only call ProvideValue during actual XAML parsing where the parser supplies IXamlTypeResolver.","In tests/custom hosts, supply a service provider implementing IServiceProvider.GetService that returns an IXamlTypeResolver.","If you already have the Type, use MemberType/TypeExtension with a Type instead of resolving via name."],"exampleFix":"// before\nvar value = new StaticExtension(\"sys:String.Empty\").ProvideValue(new SimpleProvider()); // no IXamlTypeResolver\n// after\nvar value = new StaticExtension(\"sys:String.Empty\").ProvideValue(xamlParserServiceProvider); // parser-supplied provider","handlingStrategy":"type-guard","validationCode":"var resolver = serviceProvider?.GetService(typeof(IXamlTypeResolver)) as IXamlTypeResolver;\nif (resolver == null) throw new InvalidOperationException(\"ProvideValue requires a service provider with IXamlTypeResolver (XAML parser context)\");","typeGuard":"static bool CanResolveTypes(IServiceProvider sp) => sp?.GetService(typeof(IXamlTypeResolver)) is IXamlTypeResolver;","tryCatchPattern":"try { value = ext.ProvideValue(provider); } catch (ArgumentException ex) when (ex.Message.Contains(\"IXamlTypeResolver\")) { /* extension used outside XAML context — resolve type manually */ }","preventionTips":["Only call ProvideValue inside real XAML parsing where the parser supplies services.","In tests, implement a stub IServiceProvider that returns an IXamlTypeResolver.","Use TypeExtension(typeof(T)) when you already have the Type."],"tags":["xaml","markup-extension","service-provider","type-resolver"],"backgroundTag":"missing-dependency","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"}