private object Invoke(object target, Flow flow) { if (useExpandedParameters) { switch (inputParameters.Count) { case 0: return(member.Invoke(target)); case 1: return(member.Invoke(target, flow.GetConvertedValue(inputParameters[0]))); case 2: return(member.Invoke(target, flow.GetConvertedValue(inputParameters[0]), flow.GetConvertedValue(inputParameters[1]))); case 3: return(member.Invoke(target, flow.GetConvertedValue(inputParameters[0]), flow.GetConvertedValue(inputParameters[1]), flow.GetConvertedValue(inputParameters[2]))); case 4: return(member.Invoke(target, flow.GetConvertedValue(inputParameters[0]), flow.GetConvertedValue(inputParameters[1]), flow.GetConvertedValue(inputParameters[2]), flow.GetConvertedValue(inputParameters[3]))); case 5: return(member.Invoke(target, flow.GetConvertedValue(inputParameters[0]), flow.GetConvertedValue(inputParameters[1]), flow.GetConvertedValue(inputParameters[2]), flow.GetConvertedValue(inputParameters[3]), flow.GetConvertedValue(inputParameters[4]))); default: throw new NotSupportedException(); } } else { var arguments = new object[parameterCount]; for (int parameterIndex = 0; parameterIndex < parameterCount; parameterIndex++) { if (inputParameters.TryGetValue(parameterIndex, out var inputParameter)) { arguments[parameterIndex] = flow.GetConvertedValue(inputParameter); } } var result = member.Invoke(target, arguments); for (int parameterIndex = 0; parameterIndex < parameterCount; parameterIndex++) { if (outputParameters.TryGetValue(parameterIndex, out var outputParameter)) { flow.SetValue(outputParameter, arguments[parameterIndex]); } } return(result); } }