public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
        {
            _counter++;

            // Create property fields.
            var viewProperty      = property.FindPropertyRelative("Type");
            var modelTypeProperty = property.FindPropertyRelative("ModelType");
            var viewModelProperty = property.FindPropertyRelative("ViewModelType");


            EditorGUILayout.PropertyField(property.FindPropertyRelative("ViewName"));
            EditorGUILayout.PropertyField(property.FindPropertyRelative("View"));
            EditorGUILayout.PropertyField(property.FindPropertyRelative("Tag"));

            var sourceModelType = modelTypeProperty.GetSerializedType();
            var viewType        = viewProperty.GetSerializedType();
            var viewModelType   = viewModelProperty.GetSerializedType();
            var baseViewType    = ViewReflectionTool.GetBaseViewType(viewType);

            var modelTypeName = sourceModelType == null ? _emptyValue : sourceModelType.Name;
            var viewTypeName  = viewType == null ? _emptyValue : viewType.Name;

            EditorGUILayout.Popup(new GUIContent(viewProperty.displayName), 0, new[] { viewTypeName });
            EditorGUILayout.Popup(new GUIContent(modelTypeProperty.displayName), 0, new[] { modelTypeName });
            TypeDrawer.DrawLayoutTypePopup(new GUIContent(modelTypeProperty.displayName), sourceModelType, viewModelType);
        }
    void DrawProperty(PropertyInfo propertyInfo)
    {
        try
        {
            if (propertyInfo.GetGetMethod(true) == null)
            {
                return;
            }

            bool hasSetMethod = propertyInfo.GetSetMethod(true) != null;
            if (hasSetMethod == false)
            {
                GUI.enabled = false;
            }

            object value = TypeDrawer.Draw(propertyInfo.PropertyType, propertyInfo.Name, propertyInfo.GetValue(target, null));

            if (hasSetMethod)
            {
                propertyInfo.SetValue(target, value, null);
            }

            GUI.enabled = true;
        }
        catch (Exception ex)
        {
            EditorGUILayout.LabelField(ex.ToString());
        }
    }
    void DrawMethod(MethodInfo methodInfo)
    {
        try
        {
            var impossibleParams = methodInfo.GetParameters().Where(item =>
                                                                    item.ParameterType != typeof(int) &&
                                                                    item.ParameterType != typeof(float) &&
                                                                    item.ParameterType != typeof(string) &&
                                                                    item.ParameterType != typeof(bool) &&
                                                                    item.ParameterType != typeof(Vector2) &&
                                                                    item.ParameterType != typeof(Vector3) &&
                                                                    item.ParameterType != typeof(Vector4) &&
                                                                    item.ParameterType.IsEnum == false).ToArray();

            if (impossibleParams.Length > 0)
            {
                return;
            }

            EditorGUILayout.BeginHorizontal();
            EditorGUILayout.PrefixLabel(methodInfo.Name);

            List <object> methodParams = null;
            if (_methodParamsDict.TryGetValue(methodInfo, out methodParams) == false)
            {
                methodParams = new List <object>();
                _methodParamsDict.Add(methodInfo, methodParams);
            }

            EditorGUILayout.BeginVertical();

            ParameterInfo[] parameters = methodInfo.GetParameters();
            for (int i = 0; i < parameters.Length; ++i)
            {
                if (methodParams.Count <= i)
                {
                    if (parameters[i].ParameterType.IsValueType)
                    {
                        methodParams.Add(Activator.CreateInstance(parameters[i].ParameterType));
                    }
                    else
                    {
                        methodParams.Add(null);
                    }
                }

                methodParams[i] = TypeDrawer.Draw(parameters[i].ParameterType, parameters[i].Name, methodParams[i]);
            }

            if (GUILayout.Button("Invoke"))
            {
                object returnValue = methodInfo.Invoke(target, methodParams.ToArray());
                if (returnValue != null)
                {
                    Debug.Log(returnValue);
                }
            }

            EditorGUILayout.EndVertical();

            EditorGUILayout.EndHorizontal();
        }
        catch (Exception ex)
        {
            EditorGUILayout.LabelField(ex.ToString());
        }
    }