{"record":{"id":"05d86aaf5c025516","repo":"dotnet/wpf","slug":"sr-format-sr-dtypenotsupportforsystemtype-systemtype-name","errorCode":null,"errorMessage":"SR.Format(SR.DTypeNotSupportForSystemType, systemType.Name)","messagePattern":"SR\\.Format\\(SR\\.DTypeNotSupportForSystemType, systemType\\.Name\\)","errorType":"exception","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"src/Microsoft.DotNet.Wpf/src/WindowsBase/System/Windows/DependencyObjectType.cs","lineNumber":42,"sourceCode":"    ///     </list>\n    /// </remarks>\n    public class DependencyObjectType\n    {\n        /// <summary>\n        ///     Retrieve a DependencyObjectType that represents a given system (CLR) type\n        /// </summary>\n        /// <param name=\"systemType\">The system (CLR) type to convert</param>\n        /// <returns>\n        ///     A DependencyObjectType that represents the system (CLR) type (will create\n        ///     a new one if doesn't exist)\n        /// </returns>\n        public static DependencyObjectType FromSystemType(Type systemType)\n        {\n            ArgumentNullException.ThrowIfNull(systemType);\n\n            if (!typeof(DependencyObject).IsAssignableFrom(systemType))\n            {\n                throw new ArgumentException(SR.Format(SR.DTypeNotSupportForSystemType, systemType.Name));\n            }\n\n            return FromSystemTypeInternal(systemType);\n        }\n\n        /// <summary>\n        ///     Helper method for the public FromSystemType call but without\n        ///     the expensive IsAssignableFrom parameter validation.\n        /// </summary>\n        internal static DependencyObjectType FromSystemTypeInternal(Type systemType)\n        {\n            Debug.Assert(systemType != null && typeof(DependencyObject).IsAssignableFrom(systemType), \"Invalid systemType argument\");\n\n            DependencyObjectType retVal;\n\n            lock(_lock)\n            {\n                // Recursive routine to (set up if necessary) and use the","sourceCodeStart":24,"sourceCodeEnd":60,"githubUrl":"https://github.com/dotnet/wpf/blob/81131a70a4c573cd62748a5c36908fc4d662daa9/src/Microsoft.DotNet.Wpf/src/WindowsBase/System/Windows/DependencyObjectType.cs#L24-L60","documentation":"DependencyObjectType.FromSystemType throws ArgumentException when the supplied System.Type does not derive from DependencyObject. DependencyObjectTypes can only be registered for types in the DependencyObject hierarchy; the message names the offending system type.","triggerScenarios":"Calling DependencyObjectType.FromSystemType(typeof(SomePoco)) where SomePoco does not inherit (directly or transitively) from DependencyObject.","commonSituations":"Passing a plain CLR class or interface intended for the property system without making it a DependencyObject, refactoring a class off the DependencyObject base while keeping DType registration, reflection-driven registration loops hitting non-DO types.","solutions":["Make the type derive from DependencyObject (directly or via a base class) before registering","Filter candidate types with typeof(DependencyObject).IsAssignableFrom(t) before calling FromSystemType","If the type cannot be a DependencyObject, use it as a plain property value instead of registering a DType","Skip interfaces/abstract non-DO types in registration loops"],"exampleFix":"// before\nvar dType = DependencyObjectType.FromSystemType(typeof(MyPlainClass)); // not a DO\n// after\nif (typeof(DependencyObject).IsAssignableFrom(typeof(MyControl))) {\n    var dType = DependencyObjectType.FromSystemType(typeof(MyControl));\n}","handlingStrategy":"validation","validationCode":"if (!typeof(DependencyObject).IsAssignableFrom(systemType))\n    throw new ArgumentException($\"{systemType.Name} must derive from DependencyObject\");\nvar dType = DependencyObjectType.FromSystemType(systemType);","typeGuard":"static bool CanRegisterDType(Type t) => typeof(DependencyObject).IsAssignableFrom(t);","tryCatchPattern":"try { var dType = DependencyObjectType.FromSystemType(t); }\ncatch (ArgumentException) when (!typeof(DependencyObject).IsAssignableFrom(t)) { SkipRegistration(t); }","preventionTips":["Only call FromSystemType on types deriving from DependencyObject","Filter reflection-driven registration lists with IsAssignableFrom","Keep custom controls inheriting DependencyObject when using the DP system"],"tags":["wpf","dependency-object","type-system"],"backgroundTag":"type-mismatch","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"}