예제 #1
0
        private static void SetDefaultValue(ParameterInfo parameter, ConstructorParameterInfo parameterInfo,
                                            IActivationExpressionRequest newRequest)
        {
            try
            {
                if (parameterInfo?.DefaultValue != null)
                {
                    newRequest.SetDefaultValue(new DefaultValueInformation {
                        DefaultValue = parameterInfo.DefaultValue
                    });
                }
                else if (parameter.HasDefaultValue)
                {
                    var defaultValue = parameter.DefaultValue;

                    if (defaultValue == null &&
                        parameter.ParameterType.GetTypeInfo().IsValueType)
                    {
                        defaultValue = Activator.CreateInstance(parameter.ParameterType);
                    }

                    newRequest.SetDefaultValue(new DefaultValueInformation {
                        DefaultValue = defaultValue
                    });
                }
            }
            catch (FormatException) when(parameter.ParameterType == typeof(DateTime))
            {
                newRequest.SetDefaultValue(new DefaultValueInformation {
                    DefaultValue = default(DateTime)
                });
            }
        }
예제 #2
0
        /// <summary>
        /// Get expression for parameter
        /// </summary>
        /// <param name="parameter"></param>
        /// <param name="parameterInfo"></param>
        /// <param name="injectionScope"></param>
        /// <param name="configuration"></param>
        /// <param name="request"></param>
        /// <returns></returns>
        protected virtual IActivationExpressionResult GetParameterExpression(ParameterInfo parameter, ConstructorParameterInfo parameterInfo, IInjectionScope injectionScope, TypeActivationConfiguration configuration, IActivationExpressionRequest request, out IActivationExpressionRequest newRequest)
        {
            if (parameterInfo?.ExportFunc != null)
            {
                newRequest = null;

                return(CallExportFunc(configuration.ActivationStrategy, parameter, parameterInfo, injectionScope, request, configuration.ExternallyOwned));
            }

            newRequest = request.NewRequest(parameterInfo?.UseType ?? parameter.ParameterType,
                                            configuration.ActivationStrategy,
                                            configuration.ActivationType,
                                            RequestType.ConstructorParameter,
                                            parameter,
                                            true,
                                            true);

            if (parameterInfo?.LocateWithKey != null)
            {
                newRequest.SetLocateKey(parameterInfo.LocateWithKey);
            }
            else if (injectionScope.ScopeConfiguration.Behaviors.KeyedTypeSelector(parameter.ParameterType))
            {
                newRequest.SetLocateKey(parameter.Name);
            }

            if (parameterInfo?.DefaultValue != null)
            {
                newRequest.SetDefaultValue(new DefaultValueInformation {
                    DefaultValue = parameterInfo.DefaultValue
                });
            }
            else if (parameter.HasDefaultValue)
            {
                newRequest.SetDefaultValue(new DefaultValueInformation {
                    DefaultValue = parameter.DefaultValue
                });
            }

            if (parameterInfo != null)
            {
                newRequest.IsDynamic = parameterInfo.IsDynamic;

                newRequest.SetIsRequired(parameterInfo.IsRequired.GetValueOrDefault(!parameter.IsOptional));

                newRequest.SetFilter(parameterInfo.ExportStrategyFilter);

                newRequest.SetEnumerableComparer(parameterInfo.EnumerableComparer);
            }
            else
            {
                newRequest.SetIsRequired(!parameter.IsOptional);
            }

            return(newRequest.Services.ExpressionBuilder.GetActivationExpression(injectionScope, newRequest));
        }