Exemplo n.º 1
0
 /// <summary>
 /// 执行方法
 /// </summary>
 /// <param name="container">对象</param>
 /// <param name="methodName">方法名</param>
 /// <param name="args">实参</param>
 /// <returns></returns>
 public object CallMethod(object container, string methodName, object[] args)
 {
     if (container != null)
     {
         var m = GetExcuteMethodProxy(container, methodName, args);
         if (m != null)
         {
             if (!m.IsMatchParameters)
             {
                 args = DynamicHelpers.ChangeParameters((Dictionary <object, object>)args[0], m.Parameters);
             }
             for (int i = 0; i < m.Parameters.Length; i++)
             {
                 if (m.Parameters[i] != null && args[i] != null && args[i].GetType() != m.Parameters[i].ParameterType)
                 {
                     args[i] = Convert.ChangeType(args[i], m.Parameters[i].ParameterType);
                 }
             }
             return(m.Delegate(container, args));
         }
     }
     return(null);
 }
Exemplo n.º 2
0
        /// <summary>
        /// 调用实例方法
        /// </summary>
        /// <param name="container">实例对象</param>
        /// <param name="methodName">方法名</param>
        /// <param name="args">形参</param>
        /// <returns>object</returns>
        public object CallMethod(object container, string methodName, object[] args)
        {
            Type[] types        = new Type[args.Length];
            bool   hasNullValue = false;

            for (int i = 0; i < args.Length; i++)
            {
                if (args[i] != null)
                {
                    types[i] = args[i].GetType();
                }
                else
                {
                    hasNullValue = true;
                }
            }

            Type       t      = container.GetType();
            MethodInfo method = DynamicHelpers.GetMethod(t, methodName, types);

            if (method != null)
            {
                //if (hasParam)
                //{
                //    Array arr;
                //    if (types.Length - 1 == args.Length)
                //    {
                //        arr = null;
                //    }
                //    else
                //    {
                //        arr = Array.CreateInstance(types[types.Length - 1].GetElementType(), args.Length - types.Length + 1);
                //        for (int i = types.Length - 1; i < args.Length; i++)
                //        {
                //            arr.SetValue(args[i], i - (types.Length - 1));
                //        }

                //        object[] newArgs = new object[types.Length];

                //        for (int i = 0; i < newArgs.Length - 1; i++)
                //        {
                //            newArgs[i] = args[i];
                //        }
                //        newArgs[newArgs.Length - 1] = arr;

                //        return method.Invoke(container, newArgs);
                //    }
                //}

                ParameterInfo[] pi = method.GetParameters();
                //处理可选参数
                if (types.Length == 1 && types[0] == typeof(Dictionary <object, object>) &&
                    (pi.Length != 1 || !pi[0].ParameterType.IsSubclassOf(typeof(IDictionary))))
                {
                    //实参
                    args = DynamicHelpers.ChangeParameters((Dictionary <object, object>)args[0], pi);
                }
                else if (hasNullValue)
                {
                    for (int i = 0; i < args.Length; i++)
                    {
                        if (args[i] == null && pi[i].DefaultValue != null)
                        {
                            args[i] = pi[i].DefaultValue;
                        }
                        //else
                        //{
                        //    args[i] = DefaultForType(pi[i].ParameterType);
                        //}
                    }
                }
                return(method.Invoke(container, args));
            }

            return(null);
        }