{"record":{"id":"d00887d4dd3725b6","repo":"dotnet/wpf","slug":"sr-format-sr-markupextensionnocontext-gettype-name","errorCode":null,"errorMessage":"SR.Format(SR.MarkupExtensionNoContext, GetType().Name, \"IXamlTypeResolver\")","messagePattern":"SR\\.Format\\(SR\\.MarkupExtensionNoContext, GetType\\(\\)\\.Name, \"IXamlTypeResolver\"\\)","errorType":"exception","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"src/Microsoft.DotNet.Wpf/src/PresentationFramework/MS/Internal/Markup/StaticExtension.cs","lineNumber":83,"sourceCode":"                    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\n                string typeString = Member.Substring(0, dotIndex);\n                if (typeString == string.Empty)\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                IXamlTypeResolver xamlTypeResolver = serviceProvider.GetService(typeof(IXamlTypeResolver)) as IXamlTypeResolver;\n                if (xamlTypeResolver == null)\n                {\n                    throw new ArgumentException(SR.Format(SR.MarkupExtensionNoContext, GetType().Name, \"IXamlTypeResolver\"));\n                }\n\n                // Use the type resolver to get a Type instance\n\n                MemberType = xamlTypeResolver.Resolve(typeString);\n\n                // Get the member name substring\n\n                Member = Member.Substring(dotIndex + 1, Member.Length - dotIndex - 1);\n            }\n\n            value = CommandConverter.GetKnownControlCommand(MemberType, Member);\n            if (value != null)\n            {\n                return value;\n            }\n\n            return base.ProvideValue(serviceProvider);","sourceCodeStart":65,"sourceCodeEnd":101,"githubUrl":"https://github.com/dotnet/wpf/blob/81131a70a4c573cd62748a5c36908fc4d662daa9/src/Microsoft.DotNet.Wpf/src/PresentationFramework/MS/Internal/Markup/StaticExtension.cs#L65-L101","documentation":"StaticExtension.ProvideValue requires the service provider passed to it to supply the IXamlTypeResolver service, which is what converts the type name in the Member string into a Type. If serviceProvider.GetService(typeof(IXamlTypeResolver)) returns null (the context is not a XAML parser context), the extension cannot resolve names and throws ArgumentException with MarkupExtensionNoContext.","triggerScenarios":"Calling StaticExtension.ProvideValue with a plain ServiceProvider or a mock that does not register IXamlTypeResolver; invoking the extension outside a real XAML parse (e.g. manually in unit tests or from design-time code without a parser context).","commonSituations":"Unit-testing a markup extension with a bare ServiceProvider; calling ProvideValue on a markup extension after deserializing it from BAML outside a parser; custom designer/extensibility code that passes an incomplete service provider.","solutions":["Obtain the service provider from a real XAML parse (put the extension in XAML instead of calling ProvideValue manually).","Register IXamlTypeResolver on the service provider you pass: sp.AddService(typeof(IXamlTypeResolver), resolver) with a working implementation (e.g. XamlTypeResolver backed by the ParserContext's XmlnsDictionary).","In tests, implement a fake IXamlTypeResolver whose Resolve returns the expected Type and register it in the test service provider.","If you only know the Type already, skip resolution entirely and use StaticExtension(Member, type) or access the member directly via reflection."],"exampleFix":"// before\nvar sp = new ServiceProvider();\nvar value = new StaticExtension(\"sys:String.Empty\").ProvideValue(sp); // throws: no IXamlTypeResolver\n// after\nsp.AddService(typeof(IXamlTypeResolver), new TestXamlTypeResolver());\nvar value = new StaticExtension(\"sys:String.Empty\").ProvideValue(sp);","handlingStrategy":"try-catch","validationCode":"var resolver = serviceProvider?.GetService(typeof(IXamlTypeResolver)) as IXamlTypeResolver;\nbool canProvide = resolver != null;","typeGuard":"static bool HasTypeResolver(IServiceProvider sp) => sp?.GetService(typeof(IXamlTypeResolver)) is IXamlTypeResolver;","tryCatchPattern":"try { return ext.ProvideValue(sp); }\ncatch (ArgumentException ex) when (ex.Message.Contains(\"IXamlTypeResolver\")) { return fallbackValue; }","preventionTips":["Never call markup-extension ProvideValue outside a real XAML parse or a test provider that registers IXamlTypeResolver","In tests, build a ServiceProvider with IXamlTypeResolver registered before invoking extensions","Use the StaticExtension(type, member) constructor when the Type is already known, bypassing resolution"],"tags":["wpf","xaml","service-provider","missing-service"],"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"}