public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
        {
            DictionaryViewAttribute viewAttr = GetViewAttr();

            if (viewAttr == null)
            {
                EditorGUI.PropertyField(position, property, label, true);
                return;
            }

            position.height = 18;

            if (!TryValidate(property, out string message))
            {
                if (message != null && viewAttr.ShowUnsupportedBox)
                {
                    EditorGUI.HelpBox(position, message, MessageType.Error);
                }
                return;
            }

            int fieldToken = fieldInfo.MetadataToken;

            if (!Foldouts.ContainsKey(fieldToken))
            {
                Foldouts[fieldToken] = false;
            }

            IEditorDictionary dict = GetDict(property);

            if (DrawFoldout(position, label, dict, viewAttr.DefaultKey, viewAttr.DefaultValue))
            {
                DrawBody(position, dict);
            }
        }
        private bool ValidateDefaultConstructors(SerializedProperty property, out string message)
        {
            DictionaryViewAttribute viewAttr = GetViewAttr();
            IEditorDictionary       dict     = GetDict(property);

            if (viewAttr.DefaultKey == null)
            {
                try
                {
                    CreateInstance(dict !.KeyType);
                }
                catch (MissingMethodException)
                {
                    message = "Invalid key constructor. Use DictionaryView(defaultKey: ...)";
                    return(false);
                }
            }

            if (viewAttr.DefaultValue == null)
            {
                try
                {
                    CreateInstance(dict !.ValueType);
                }
                catch (MissingMethodException)
                {
                    message = "Invalid value constructor. Use DictionaryView(defaultValue: ...)";
                    return(false);
                }
            }

            message = null;
            return(true);
        }
        public override float GetPropertyHeight(SerializedProperty property, GUIContent label)
        {
            DictionaryViewAttribute viewAttr = GetViewAttr();

            if (viewAttr == null)
            {
                return(property.CountInProperty() * 20);
            }

            if (!TryValidate(property, out string message))
            {
                return(viewAttr.ShowUnsupportedBox && message != null ? 18 : 0);
            }

            int fieldToken = fieldInfo.MetadataToken;

            if (!Foldouts.ContainsKey(fieldToken) || !Foldouts[fieldToken])
            {
                return(18);
            }

            const float space = 2;

            return(18 + GetDict(property).GetEntries().Count() * (18 + space) + space);
        }