Exemplo n.º 1
0
        /// <summary>
        /// Automatically invokes the method based on its type (instance/ static)
        /// </summary>
        /// <param name="method">Method to be invoked</param>
        /// <param name="objects">Target objects</param>
        /// <param name="predicate">Predicate for filtering objects</param>
        /// <param name="parameters">Parameters of the method</param>
        /// <returns>The string describing result of the execution or error message (discardable)</returns>
        public static string AutoInvoke(this MethodBase method, UnityEngine.Object[] objects, Func <UnityEngine.Object, bool> predicate, object[] parameters)
        {
            ParameterInfo[] parameterInfos = method.GetParameters();

            int parametersLength      = parameters == null ? 0 : parameters.Length;
            int fixedParametersLength = parameterInfos == null ? 0 : parameterInfos.Length;

            object[] fixedParameters = fixedParametersLength == 0 ? null : new object[fixedParametersLength];

            for (int i = 0; i < fixedParametersLength; i++)
            {
                fixedParameters[i] = i < parametersLength ? parameters[i] : parameterInfos[i].DefaultValue;
            }

            if (method.IsStatic)
            {
                return(method.AutoInvokeStatic(fixedParameters));
            }

            List <UnityEngine.Object> objectList = objects.Where(predicate).ToList();

            if (objectList.Count == 0)
            {
                return(StringConstantInternal.objectNotFoundWarning.Color(Color.yellow));
            }

            string s = "";

            objectList.ForEach(obj => s = s + method.AutoInvokeInstance(obj, fixedParameters) + "\n");

            return(s.Substring(0, s.Length - 1));
        }