public override void ReorderArgumentArray(ref object[] args, object state) { if (state == null) { return; } ReorderState reorder = (ReorderState)state; int vararg_count = reorder.vararg_count; int args_count = args.Length; int args_start = 0; if (reorder.pass_context) { args_count--; args_start = 1; } object[] old_args; if (vararg_count != -1) { old_args = new object[args_count + vararg_count - 1]; Array.Copy(args, args_start, old_args, 0, args_count); Array.Copy((Array)args[args.Length - 1], 0, old_args, args.Length - 1, ((Array)args[args.Length - 1]).Length); } else { old_args = new object[args_count]; Array.Copy(args, args_start, old_args, 0, args_count); } args = old_args; }
public override MethodBase BindToMethod (BindingFlags bindingAttr, MethodBase[] match, ref object[] args, ParameterModifier[] modifiers, CultureInfo culture, string[] names, out object state) { Type[] types = new Type[args.Length]; int i = 0; foreach (object arg in args) { if (arg == null) types[i] = typeof (object); else types[i] = arg.GetType (); i++; } int vararg_count; Type vararg_type; MethodBase method = SelectMethod (bindingAttr, match, types, modifiers, out vararg_count, out vararg_type); if (method == null) { state = null; return null; } bool pass_context = IsPassContext (method); if (!pass_context && vararg_count == -1) { state = null; return method; } object[] new_args; if (vararg_count != -1) { int new_args_length = args.Length - vararg_count + 1; int new_args_start = 0; if (pass_context) { new_args_length++; new_args_start = 1; } new_args = new object[new_args_length]; Array.Copy (args, 0, new_args, new_args_start, new_args.Length - 1); Array varargs = Array.CreateInstance (vararg_type, vararg_count); Array.Copy (args, new_args.Length - 1, varargs, 0, varargs.Length); new_args[new_args.Length - 1] = varargs; if (pass_context) { new_args[0] = Context; } } else { new_args = new object[args.Length + 1]; Array.Copy (args, 0, new_args, 1, args.Length); new_args[0] = Context; } args = new_args; state = new ReorderState (pass_context, vararg_count); return method; }
public override MethodBase BindToMethod(BindingFlags bindingAttr, MethodBase[] match, ref object[] args, ParameterModifier[] modifiers, CultureInfo culture, string[] names, out object state) { Type[] types = new Type[args.Length]; int i = 0; foreach (object arg in args) { if (arg == null) { types[i] = typeof(object); } else { types[i] = arg.GetType(); } i++; } int vararg_count; Type vararg_type; MethodBase method = SelectMethod(bindingAttr, match, types, modifiers, out vararg_count, out vararg_type); if (method == null) { state = null; return(null); } bool pass_context = IsPassContext(method); if (!pass_context && vararg_count == -1) { state = null; return(method); } object[] new_args; if (vararg_count != -1) { int new_args_length = args.Length - vararg_count + 1; int new_args_start = 0; if (pass_context) { new_args_length++; new_args_start = 1; } new_args = new object[new_args_length]; Array.Copy(args, 0, new_args, new_args_start, new_args.Length - 1); Array varargs = Array.CreateInstance(vararg_type, vararg_count); Array.Copy(args, new_args.Length - 1, varargs, 0, varargs.Length); new_args[new_args.Length - 1] = varargs; if (pass_context) { new_args[0] = Context; } } else { new_args = new object[args.Length + 1]; Array.Copy(args, 0, new_args, 1, args.Length); new_args[0] = Context; } args = new_args; state = new ReorderState(pass_context, vararg_count); return(method); }