public object CreateInstance(IServiceProvider provider) { for (var index = 0; index != _parameters.Length; index++) { if (_parameterValuesSet[index] == false) { var value = provider.GetService(_parameters[index].ParameterType); if (value == null) { if (!ParameterDefaultValue.TryGetDefaultValue(_parameters[index], out var defaultValue)) { throw new InvalidOperationException( $"Unable to resolve service for type '{_parameters[index].ParameterType}' while attempting to activate '{_constructor.DeclaringType}'."); } _parameterValues[index] = defaultValue; } else { _parameterValues[index] = value; } } } return(_constructor.Invoke(BindingFlags.DoNotWrapExceptions, null, _parameterValues, null)); }
private static Expression BuildFactoryExpression( ConstructorInfo constructor, int?[] parameterMap, Expression serviceProvider, Expression factoryArgumentArray) { var constructorParameters = constructor.GetParameters(); var constructorArguments = new Expression[constructorParameters.Length]; for (var i = 0; i < constructorParameters.Length; i++) { var constructorParameter = constructorParameters[i]; var parameterType = constructorParameter.ParameterType; var hasDefaultValue = ParameterDefaultValue.TryGetDefaultValue(constructorParameter, out var defaultValue); if (parameterMap[i] != null) { constructorArguments[i] = Expression.ArrayAccess(factoryArgumentArray, Expression.Constant(parameterMap[i])); } else { var parameterTypeExpression = new[] { serviceProvider, Expression.Constant(parameterType, typeof(Type)), Expression.Constant(constructor.DeclaringType, typeof(Type)), Expression.Constant(hasDefaultValue) }; constructorArguments[i] = Expression.Call(GetServiceInfo, parameterTypeExpression); } // Support optional constructor arguments by passing in the default value // when the argument would otherwise be null. if (hasDefaultValue) { var defaultValueExpression = Expression.Constant(defaultValue); constructorArguments[i] = Expression.Coalesce(constructorArguments[i], defaultValueExpression); } constructorArguments[i] = Expression.Convert(constructorArguments[i], parameterType); } return(Expression.New(constructor, constructorArguments)); }
public object CreateInstance(IServiceProvider provider) { for (var index = 0; index != _parameters.Length; index++) { if (_parameterValuesSet[index] == false) { var value = provider.GetService(_parameters[index].ParameterType); if (value == null) { if (!ParameterDefaultValue.TryGetDefaultValue(_parameters[index], out var defaultValue)) { throw new InvalidOperationException( $"Unable to resolve service for type '{_parameters[index].ParameterType}' while attempting to activate '{_constructor.DeclaringType}'."); } _parameterValues[index] = defaultValue; } else { _parameterValues[index] = value; } } } #if NETCOREAPP3_1 return(_constructor.Invoke(BindingFlags.DoNotWrapExceptions, binder: null, parameters: _parameterValues, culture: null)); #else try { return(_constructor.Invoke(_parameterValues)); } catch (TargetInvocationException ex) when(ex.InnerException != null) { ExceptionDispatchInfo.Capture(ex.InnerException).Throw(); // The above line will always throw, but the compiler requires we throw explicitly. throw; } #endif }