/// <summary>
        /// 从类型上获取内置表达式函数集合
        /// </summary>
        /// <param name="type"></param>
        /// <returns></returns>
        public static BuiltInFunctionInfoCollection BuildBuiltInFunctionsInfo(Type type)
        {
            type.NullCheck("type");

            MethodInfo[] methods = type.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public);

            BuiltInFunctionInfoCollection result = new BuiltInFunctionInfoCollection();

            foreach (MethodInfo method in methods)
            {
                BuiltInFunctionAttribute attr = AttributeHelper.GetCustomAttribute <BuiltInFunctionAttribute>(method);

                if (attr != null)
                {
                    if (attr.FunctionName.IsNullOrEmpty())
                    {
                        attr.FunctionName = method.Name;
                    }

                    if (result.Contains(attr.FunctionName) == false)
                    {
                        result.Add(new BuiltInFunctionInfo(attr, method));
                    }
                }
            }

            return(result);
        }
        /// <summary>
        /// 从类型上获取内置表达式函数集合
        /// </summary>
        /// <param name="type"></param>
        /// <returns></returns>
        public static BuiltInFunctionInfoCollection GetBuiltInFunctionsInfo(Type type)
        {
            type.NullCheck("type");

            return(BuiltInFunctionInfoCache.Instance.GetOrAddNewValue(type, (cache, key) =>
            {
                BuiltInFunctionInfoCollection info = BuildBuiltInFunctionsInfo(type);

                cache.Add(key, info);

                return info;
            }));
        }
        /// <summary>
        /// 执行静态函数
        /// </summary>
        /// <param name="funcName"></param>
        /// <param name="type"></param>
        /// <param name="arrParams"></param>
        /// <param name="callerContext"></param>
        /// <returns></returns>
        public static object ExecuteFunction(string funcName, Type type, ParamObjectCollection arrParams, object callerContext)
        {
            type.NullCheck("type");

            BuiltInFunctionInfoCollection funcsInfo = GetBuiltInFunctionsInfo(type);

            object result = null;

            if (funcsInfo.Contains(funcName))
            {
                result = funcsInfo[funcName].ExecuteFunction(null, arrParams, callerContext);
            }

            return(result);
        }
        /// <summary>
        /// 执行函数
        /// </summary>
        /// <param name="funcName"></param>
        /// <param name="target"></param>
        /// <param name="arrParams"></param>
        /// <param name="callerContext"></param>
        /// <returns></returns>
        public static object ExecuteFunction(string funcName, object target, ParamObjectCollection arrParams, object callerContext)
        {
            target.NullCheck("target");

            BuiltInFunctionInfoCollection funcsInfo = GetBuiltInFunctionsInfo(target.GetType());

            object result = null;

            if (funcsInfo.Contains(funcName))
            {
                result = funcsInfo[funcName].ExecuteFunction(target, arrParams, callerContext);
            }

            return(result);
        }