internal static object[] CoerceArgs(MethodBase mb, object[] args, ParameterInfo[] pi) { if (pi == null) { throw new ArgumentNullException("pi"); } if (pi.Length != args.Length) { throw new RemotingException(string.Format(CultureInfo.CurrentCulture, Environment.GetResourceString("Remoting_Message_ArgMismatch"), new object[] { mb.DeclaringType.FullName, mb.Name, args.Length, pi.Length })); } for (int i = 0; i < pi.Length; i++) { ParameterInfo parameterInfo = pi[i]; Type parameterType = parameterInfo.ParameterType; object obj = args[i]; if (obj != null) { args[i] = Message.CoerceArg(obj, parameterType); } else if (parameterType.IsByRef) { Type elementType = parameterType.GetElementType(); if (elementType.IsValueType) { if (parameterInfo.IsOut) { args[i] = Activator.CreateInstance(elementType, true); } else if (!elementType.IsGenericType || !(elementType.GetGenericTypeDefinition() == typeof(Nullable <>))) { throw new RemotingException(string.Format(CultureInfo.CurrentCulture, Environment.GetResourceString("Remoting_Message_MissingArgValue"), elementType.FullName, i)); } } } else if (parameterType.IsValueType && (!parameterType.IsGenericType || !(parameterType.GetGenericTypeDefinition() == typeof(Nullable <>)))) { throw new RemotingException(string.Format(CultureInfo.CurrentCulture, Environment.GetResourceString("Remoting_Message_MissingArgValue"), parameterType.FullName, i)); } } return(args); }