/// <summary>
        /// Type compliance is perfect for types without properties, other bad
        /// </summary>
        public override int TypeCompliance(Type targetType)
        {
            // Determine base properties from supported types
            var baseProperties = SupportedTypes
                                 .SelectMany(t => t.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic))
                                 .Select(prop => prop.Name).Distinct().ToList();
            // Get properties from target type and make sure all are defined by the base class
            var targetProps = targetType.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)
                              .Select(prop => prop.Name).Distinct();

            return(targetProps.All(baseProperties.Contains) ? PerfectMatch : BadCompliance);
        }