public static LambdaExpression CreateSetter(LambdaExpression getter)
        {
            if (getter == null)
            {
                throw new ArgumentNullException("getter");
            }
            var valueParameter = Expression.Parameter(getter.ReturnType);
            var visitor        = new SetExpressionRewriter(valueParameter);
            var body           = visitor.Visit(getter.Body);

            if (body == null)
            {
                return(null);
            }
            var parameters = new ParameterExpression[getter.Parameters.Count + 1];

            getter.Parameters.CopyTo(parameters, 0);
            parameters[parameters.Length - 1] = valueParameter;
            var typeParameters = new Type[getter.Parameters.Count + 1];

            for (int i = 0; i < getter.Parameters.Count; i++)
            {
                typeParameters[i] = getter.Parameters[i].Type;
            }
            typeParameters[typeParameters.Length - 1] = getter.ReturnType;
            var delegateType = actionTypes[getter.Parameters.Count].MakeGenericType(typeParameters);

            return(Expression.Lambda(delegateType, body, parameters));
        }
        public static Expression <Action <T, TValue> > CreateSetter <T, TValue>(Expression <Func <T, TValue> > getter)
        {
            if (getter == null)
            {
                throw new ArgumentNullException("getter");
            }
            var p       = Expression.Parameter(typeof(TValue));
            var visitor = new SetExpressionRewriter(p);
            var body    = visitor.Visit(getter.Body);

            if (body == null)
            {
                return(null);
            }
            return(Expression.Lambda <Action <T, TValue> >(body, getter.Parameters[0], p));
        }