public static Expression CreateExpression(IContainerContext containerContext, ResolutionConstructor resolutionConstructor, ResolutionInfo resolutionInfo, Expression resolutionInfoExpression, ResolutionMember[] members = null) { var length = resolutionConstructor.Parameters.Length; var arguments = new Expression[length]; for (var i = 0; i < length; i++) { var parameter = resolutionConstructor.Parameters[i]; arguments[i] = containerContext.ResolutionStrategy.GetExpressionForResolutionTarget(parameter, resolutionInfo, resolutionInfoExpression); } var newExpression = Expression.New(resolutionConstructor.Constructor, arguments); if (members == null || members.Length == 0) return newExpression; { var propLength = members.Length; var propertyExpressions = new MemberBinding[propLength]; for (var i = 0; i < propLength; i++) { var member = members[i]; var propertyExpression = Expression.Bind(member.MemberInfo, containerContext.ResolutionStrategy.GetExpressionForResolutionTarget(member.ResolutionTarget, resolutionInfo, resolutionInfoExpression)); propertyExpressions[i] = propertyExpression; } return Expression.MemberInit(newExpression, propertyExpressions); } }
public static CreateInstance CreateConstructorExpression(IContainerContext containerContext, ResolutionConstructor resolutionConstructor, ResolutionMember[] members = null) { var strategyParameter = Expression.Constant(containerContext.ResolutionStrategy, typeof(IResolutionStrategy)); var resolutionInfoParameter = Expression.Parameter(typeof(ResolutionInfo), "resolutionInfo"); var arguments = CreateExpressionFromResolutionTargets(resolutionConstructor.Parameters, strategyParameter, resolutionInfoParameter); var newExpression = Expression.New(resolutionConstructor.Constructor, arguments); if (members == null || members.Length == 0) return Expression.Lambda<CreateInstance>(newExpression, resolutionInfoParameter).Compile(); var length = members.Length; var propertyExpressions = new MemberBinding[length]; for (var i = 0; i < length; i++) { var member = members[i]; var propertyExpression = Expression.Bind(member.MemberInfo, CreateResolutionTargetExpression(member.ResolutionTarget, strategyParameter, resolutionInfoParameter)); propertyExpressions[i] = propertyExpression; } var initExpression = Expression.MemberInit(newExpression, propertyExpressions); return Expression.Lambda<CreateInstance>(initExpression, resolutionInfoParameter).Compile(); }