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);

        }