/// <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); }
/// <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); }