//----------------------------------------------------------------------
        void DrawEnumerableFieldAndUpdateValues(ref object _param, ParameterInfo _info)
        {
            var list          = _param as IList;
            int desiredLength = EditorGUILayout.IntField("Count", list.Count);
            int diff          = desiredLength - list.Count;
            var paramType     = _info.ParameterType;
            var baseType      = paramType.IsArray ?  paramType.GetElementType() : paramType.GetGenericArguments() [0];

            if (diff != 0)
            {
                for (int i = 0; i < diff; i++)
                {
                    object value = CreateDefaultObject(baseType);
                    list.Add(value);
                }

                int target = list.Count - 1 + diff;
                for (int i = list.Count - 1; i > target; i--)
                {
                    list.RemoveAt(i);
                }
            }

            for (int i = 0; i < list.Count; i++)
            {
                var item = list[i];
                list[i] = UnitySerialiseFieldByType [baseType] (item, _info);
            }
        }
        //----------------------------------------------------------------------
        void DrawListFieldAndUpdateValues(ref object _param, ParameterInfo _info)
        {
            var list          = _param as IList;
            int desiredLength = EditorGUILayout.IntField("Length", list.Count);
            int diff          = desiredLength - list.Count;
            var baseType      = _info.ParameterType.GetGenericArguments()[0];

            //add/remove contents
            for (int i = 0; i < diff; i++)
            {
                object value = CreateDefaultObject(baseType);
                list.Add(value);
            }
            for (int i = list.Count - 1; i > list.Count + diff; i--)
            {
                list.RemoveAt(i);
            }

            for (int i = 0; i < list.Count; i++)
            {
                var item = list[i];
                if (list[i] != null)
                {
                    Debug.LogFormat("{0}:{1}", i, item.ToString());
                }
                list[i] = UnitySerialiseFieldByType[baseType](item, _info);
            }
        }
        //----------------------------------------------------------------------
        void DrawParameterFieldAndUpdateValue(ref object _param, ParameterInfo _info)
        {
            Type type = _info.ParameterType;

            if (type.IsEnum)
            {
                type = typeof(System.Enum);
            }

            if (CanSerialiseEnumerable(type))
            {
                DrawEnumerableFieldAndUpdateValues(ref _param, _info);
            }
            else
            {
                _param = UnitySerialiseFieldByType [type] (_param, _info);
            }
        }
        //----------------------------------------------------------------------
        void DrawParameterFieldAndUpdateValue(ref object _param, ParameterInfo _info)
        {
            Type type = _info.ParameterType;

            if (type.IsEnum)
            {
                type = typeof(System.Enum);
            }

            if (type.IsArray)
            {
                DrawArrayFieldAndUpdateValues(ref _param, _info);
            }
            else if (CanSerialiseGenericList(type))
            {
                DrawListFieldAndUpdateValues(ref _param, _info);
            }
            else
            {
                _param = UnitySerialiseFieldByType[type](_param, _info);
            }
        }
 //----------------------------------------------------------------------
 bool CanSerialiseAllParameters(ParameterInfo[] _params)
 {
     for (int i = 0; i < _params.Length; i++)
     {
         var type = _params[i].ParameterType;
         if (type.IsEnum)
         {
             continue;
         }
         if (CanSerialiseArray(type))
         {
             type = type.GetElementType();
         }
         if (CanSerialiseGenericList(type))
         {
             type = type.GetGenericArguments()[0];
         }
         if (!UnitySerialiseFieldByType.ContainsKey(type))
         {
             return(false);
         }
     }
     return(true);
 }