public override float GetPropertyHeight(SerializedProperty property, GUIContent label)
 {
     if (property.serializedObject.isEditingMultipleObjects)
     {
         return(0);
     }
     return(2 * EditorGUIUtility.singleLineHeight * ReceiverMethod.GetAll(property.serializedObject.targetObject).Count);
 }
        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
        {
            if (property.serializedObject.isEditingMultipleObjects)
            {
                return;
            }

            EditorGUI.BeginProperty(position, label, property);

            var linker  = new ReceiverLinker();
            var members = property.FindPropertyRelative(nameof(linker.Members));

            var accessorList = new List <ReceiverLinkerItem>();

            {
                for (int i = 0; i < members.arraySize; i++)
                {
                    accessorList.Add(LoadObject(members.GetArrayElementAtIndex(i)));
                }
            }

            members.ClearArray();

            var targetObject     = property.serializedObject.targetObject as MonoBehaviour;
            var targetObjectType = targetObject.GetType();

            foreach (var method in ReceiverMethod.GetAll(targetObject))
            {
                var option = DrawProviderOptions(position, accessorList.Find(item => item.Receiver == method.Name), method, targetObject);
                position.y += EditorGUIUtility.singleLineHeight;

                var linkerItem = new ReceiverLinkerItem();
                linkerItem.Receiver     = method.Name;
                linkerItem.ReceiverType = option.ReceiverTypeName;
                linkerItem.Path         = option.Path;

                if (!string.IsNullOrEmpty(option.ReceiverTypeName))
                {
                    int size = members.arraySize;
                    members.InsertArrayElementAtIndex(size);
                    var obj = members.GetArrayElementAtIndex(size);
                    SaveObject(obj, linkerItem);
                }
                if (linkerItem.ReceiverType != ReceiverLinker.IgnoreReceiver)
                {
                    DrawProviderPreview(position, linkerItem, method, option.ReceiverType, targetObject);
                }
                position.y += EditorGUIUtility.singleLineHeight;
            }

            EditorGUI.EndProperty();
        }