// 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);
            }
        }
Пример #2
0
        // 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);
            }
        }