private void MemberExpression( MemberInfo memberInfo, Expression instanceExpr, List<ParameterExpression> locals, Dictionary<int, ParameterExpression> typedVars, Dictionary<string, ParameterExpression> namedVars, List<Expression> creations) { var fieldInfo = memberInfo as FieldInfo; var propInfo = memberInfo as PropertyInfo; if (fieldInfo != null) { var item = this.InternalFindDependence(fieldInfo.FieldType) ?? this.InternalFindDependence(fieldInfo.Name); if (item == null) { return; } var itemGenerator = new InstanceFactoryGenerator(item); var valueExpr = itemGenerator.ValueExpression(locals, typedVars, namedVars, creations); if (valueExpr != null) { var assignExpr = Expression.Assign(Expression.Field(instanceExpr, fieldInfo), valueExpr); creations.Add(assignExpr); item.Changed += (sender, e) => this.Injection.ResetInstanceFactory(); } } if (propInfo != null && propInfo.CanWrite) { var item = this.InternalFindDependence(propInfo.PropertyType) ?? this.InternalFindDependence(propInfo.Name); if (item == null) { return; } var itemGenerator = new InstanceFactoryGenerator(item); var valueExpr = itemGenerator.ValueExpression(locals, typedVars, namedVars, creations,propInfo.PropertyType); if (valueExpr != null) { var assignExpr = Expression.Assign(Expression.Property(instanceExpr, propInfo), valueExpr); creations.Add(assignExpr); item.Changed += (sender, e) => this.Injection.ResetInstanceFactory(); } } }
private Expression NewExpression( ConstructorInfo ctor, List<ParameterExpression> locals, Dictionary<int, ParameterExpression> typedVars, Dictionary<string, ParameterExpression> namedVars, List<Expression> creations) { var parameters = ctor.GetParameters(); var paramExpressions = new List<Expression>(); foreach (var parameterInfo in parameters) { var item = this.InternalFindDependence(parameterInfo.Name) ?? this.InternalFindDependence(parameterInfo.ParameterType.FullName); if (item == null) { if (parameterInfo.HasDefaultValue) { paramExpressions.Add(Expression.Constant(parameterInfo.DefaultValue, parameterInfo.ParameterType)); } else { throw new Exception("The parameter [" + parameterInfo.Name + "] of [" + ctor.DeclaringType.FullName + "] was not defined default value and can not be found in inject context."); } } else { var itemGenerator = new InstanceFactoryGenerator(item); var instanceExpr = itemGenerator.ValueExpression(locals, typedVars, namedVars, creations,parameterInfo.ParameterType); paramExpressions.Add(instanceExpr); item.Changed += (sender, e) => this.Injection.ResetInstanceFactory(); } } return Expression.New(ctor, paramExpressions); }