static IEnumerable <AttributeDescriptor <Type, string> > GetInspectorDescriptor(Type targetType)
        {
            foreach (var t in TypeCache.GetTypesDerivedFrom(targetType))
            {
                if (t.IsAbstract || t.IsInterface)
                {
                    continue;
                }
                var value = "";
                if (typeof(IRootInspector).IsAssignableFrom(t))
                {
                    value = "Inspector";
                }
                else if (typeof(IPropertyDrawer).IsAssignableFrom(t))
                {
                    value = "Property Inspector";
                }
                else
                {
                    value = "Attribute Inspector";
                }

                yield return(AttributeDescriptor.Make(t, value));
            }
        }
 static IEnumerable <AttributeDescriptor <Type, string> > GetTypeDescriptor(Type targetType, string value)
 {
     foreach (var t in TypeCache.GetTypesDerivedFrom(targetType))
     {
         if (t.IsAbstract || t.IsInterface)
         {
             continue;
         }
         yield return(AttributeDescriptor.Make(t, value));
     }
 }
        List <IAttributeDescriptor> CacheTypeInfo()
        {
            var info = new List <IAttributeDescriptor>();

            info.Add(AttributeDescriptor.Make("Namespace", Namespace));
            info.Add(AttributeDescriptor.Make("Assembly", Assembly));
            info.Add(AttributeDescriptor.Make("Property Bag Type", PropertyBagType.ToString()));
            info.Add(AttributeDescriptor.Make("Traits", string.Join(" | ", Editor.EnumUtility.EnumerateFlags(TypeTraits))));
            info.Add(AttributeDescriptor.Make("Constructable", CanBeConstructed.ToString()));
            return(info);
        }