{"record":{"id":"34e732b932730bb1","repo":"dotnet/wpf","slug":"sr-format-sr-deferringloadernocontext-nameof","errorCode":null,"errorMessage":"SR.Format(SR.DeferringLoaderNoContext, nameof(DeferrableContentConverter), typeof(T).Name)","messagePattern":"SR\\.Format\\(SR\\.DeferringLoaderNoContext, nameof\\(DeferrableContentConverter\\), typeof\\(T\\)\\.Name\\)","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/DeferrableContentConverter.cs","lineNumber":80,"sourceCode":"                {\n                    throw new InvalidOperationException(SR.ExpectedBinaryContent);\n                }\n\n                // we shouldn't pass around the service provider\n                DeferrableContent deferrableContext = new DeferrableContent(stream, schemaContext,\n                    objectWriterFactory, context, rootObjectProvider.RootObject);\n                return deferrableContext;\n            }\n\n            return base.ConvertFrom(context, culture, value);\n        }\n\n        private static T RequireService<T>(IServiceProvider provider) where T : class\n        {\n            T result = provider.GetService(typeof(T)) as T;\n            if (result == null)\n            {\n                throw new InvalidOperationException(SR.Format(SR.DeferringLoaderNoContext, nameof(DeferrableContentConverter), typeof(T).Name));\n            }\n            return result;\n        }\n    }\n}\n","sourceCodeStart":62,"sourceCodeEnd":86,"githubUrl":"https://github.com/dotnet/wpf/blob/81131a70a4c573cd62748a5c36908fc4d662daa9/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/DeferrableContentConverter.cs#L62-L86","documentation":"DeferrableContentConverter's private RequireService<T> helper resolves a required service (IXamlSchemaContextProvider, IXamlObjectWriterFactory, IProvideValueTarget, IRootObjectProvider) from the ambient IServiceProvider. If GetService returns null for the requested type, it throws InvalidOperationException stating the deferring loader has no context, naming the missing service type.","triggerScenarios":"Calling ConvertFrom with a service provider (ITypeDescriptorContext) that does not supply one of the required services — typically a hand-built ServiceProvider or a plain TypeDescriptor context with no XAML ambient services.","commonSituations":"Unit-testing the converter with a stub service provider that registers only some services, invoking the converter outside a XAML reader/writer session, or a custom XAML pipeline that omits IXamlObjectWriterFactory or IRootObjectProvider.","solutions":["Invoke the converter only within a real XAML parse (Baml2006Reader/XamlXmlReader + XamlObjectWriter), which supplies all required services","In test harnesses, register all four services: IXamlSchemaContextProvider, IXamlObjectWriterFactory, IProvideValueTarget, IRootObjectProvider","Read the exception message to see which typeof(T).Name is missing and add that service registration"],"exampleFix":"// before\nvar provider = new ServiceProvider(); // no services registered\nconverter.ConvertFrom(provider, CultureInfo.InvariantCulture, bamlStream);\n// after\nvar sp = new ServiceProvider();\nsp.AddService(typeof(IXamlSchemaContextProvider), schemaContextProvider);\nsp.AddService(typeof(IXamlObjectWriterFactory), writerFactory);\nsp.AddService(typeof(IProvideValueTarget), pvt);\nsp.AddService(typeof(IRootObjectProvider), rootProvider);","handlingStrategy":"validation","validationCode":"static void RequireDeferrableServices(IServiceProvider p)\n{\n    foreach (var t in new[] { typeof(IXamlSchemaContextProvider), typeof(IXamlObjectWriterFactory), typeof(IProvideValueTarget), typeof(IRootObjectProvider) })\n        if (p.GetService(t) == null) throw new InvalidOperationException($\"Missing service: {t.Name}\");\n}","typeGuard":"static bool HasRequiredXamlServices(IServiceProvider p) =>\n    p.GetService(typeof(IXamlSchemaContextProvider)) != null &&\n    p.GetService(typeof(IXamlObjectWriterFactory)) != null &&\n    p.GetService(typeof(IProvideValueTarget)) != null &&\n    p.GetService(typeof(IRootObjectProvider)) != null;","tryCatchPattern":"try { return (DeferrableContent)converter.ConvertFrom(provider, culture, value); }\ncatch (InvalidOperationException ex) when (ex.Message.Contains(\"DeferrableContentConverter\")) { /* log which service is missing from the message */ }","preventionTips":["Run DeferrableContentConverter only inside a real XAML reader/writer parse session","In test stubs, register all four required services before calling ConvertFrom","Read the exception message to identify exactly which service type was absent"],"tags":["wpf","xaml","service-provider"],"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"}