public static object[] MakeArguments(MethodBase method, IReadOnlyList <object> source, CancellationToken token) { // late-bound provide the CancellationToken var parameters = method.CachedParameters(); var target = new object[parameters.Count]; for (int index = 0; index < parameters.Count; ++index) { var type = parameters[index].ParameterType; bool cancel = type.IsAssignableFrom(typeof(CancellationToken)); if (cancel) { var resolved = (CancellationToken)source[index]; if (resolved.CanBeCanceled) { // consider CancellationTokenSource.CreateLinkedTokenSource // but remember to CancellationTokenSource.Dispose throw new NotSupportedException(); } target[index] = token; } else { target[index] = source[index]; } } return(target); }
public static bool TryResolveArguments(IResolver resolver, MethodBase method, out object[] arguments) { var parameters = method.CachedParameters(); if (parameters.Count == 0) { arguments = Array.Empty <object>(); return(true); } arguments = null; for (int index = 0; index < parameters.Count; ++index) { var parameter = parameters[index]; object argument; if (!TryResolveArgument(resolver, parameter, out argument)) { arguments = null; return(false); } if (arguments == null) { arguments = new object[parameters.Count]; } arguments[index] = argument; } return(arguments != null); }