// Bind a trigger argument to various parameter types. // Handles either T or T[], internal static ITriggerDataArgumentBinding <TTriggerValue> GetTriggerArgumentBinding <TMessage, TTriggerValue>( ITriggerBindingStrategy <TMessage, TTriggerValue> bindingStrategy, ParameterInfo parameter, IConverterManager converterManager, out bool singleDispatch) { ITriggerDataArgumentBinding <TTriggerValue> argumentBinding = null; if (parameter.ParameterType.IsArray) { // dispatch the entire batch in a single call. singleDispatch = false; var elementType = parameter.ParameterType.GetElementType(); var innerArgumentBinding = GetTriggerArgumentElementBinding <TMessage, TTriggerValue>(elementType, bindingStrategy, converterManager); argumentBinding = new ArrayTriggerArgumentBinding <TMessage, TTriggerValue>(bindingStrategy, innerArgumentBinding, converterManager); return(argumentBinding); } else { // Dispatch each item one at a time singleDispatch = true; var elementType = parameter.ParameterType; argumentBinding = GetTriggerArgumentElementBinding <TMessage, TTriggerValue>(elementType, bindingStrategy, converterManager); return(argumentBinding); } }
// Bind a trigger argument to various parameter types. // Handles either T or T[], internal static ITriggerDataArgumentBinding <TTriggerValue> GetTriggerArgumentBinding <TMessage, TTriggerValue>( ITriggerBindingStrategy <TMessage, TTriggerValue> bindingStrategy, ParameterInfo parameter, IConverterManager converterManager, out bool singleDispatch) { ITriggerDataArgumentBinding <TTriggerValue> argumentBinding = null; // If there's a direct binding from TMessage to the parameter's exact type; use that. // This takes precedence over array bindings. argumentBinding = GetDirectTriggerBinding <TMessage, TTriggerValue>(parameter.ParameterType, bindingStrategy, converterManager); if (argumentBinding != null) { singleDispatch = true; return(argumentBinding); } // Or array if (parameter.ParameterType.IsArray) { // dispatch the entire batch in a single call. singleDispatch = false; var elementType = parameter.ParameterType.GetElementType(); var innerArgumentBinding = GetTriggerArgumentElementBinding <TMessage, TTriggerValue>(elementType, bindingStrategy, converterManager); argumentBinding = new ArrayTriggerArgumentBinding <TMessage, TTriggerValue>(bindingStrategy, innerArgumentBinding, converterManager); return(argumentBinding); } else { // Dispatch each item one at a time singleDispatch = true; var elementType = parameter.ParameterType; argumentBinding = GetTriggerArgumentElementBinding <TMessage, TTriggerValue>(elementType, bindingStrategy, converterManager); return(argumentBinding); } }