/// <summary>
        /// Implementation of <see cref="IExpressionGenerator.GenerateExpression"/>. Calls
        /// <see cref="CreateExpression"/> and raises the <see cref="ExpressionGenerated"/> event
        /// </summary>
        /// <param name="type">
        /// The type.
        /// </param>
        /// <returns>
        /// A <see cref="System.Linq.Expressions.Expression"/> that when evaluated 
        /// will return an instance of the given type, taking into account any
        /// event handlers that may have modified the expression
        /// </returns>
        public Expression GenerateExpression(Type type)
        {
            var expression = this.CreateExpression(type);
            var args = new ExpressionGeneratedEventArgs(type, expression);
            this.OnExpressionGenerated(args);
            while (args.Expression.CanReduce)
            {
                args.Expression = args.Expression.Reduce();
            }

            return args.Expression;
        }
 /// <summary>
 /// Raises the <see cref="ExpressionGenerated"/> event.
 /// </summary>
 /// <param name="args">
 /// The event args for this event.
 /// </param>
 protected virtual void OnExpressionGenerated(ExpressionGeneratedEventArgs args)
 {
     var handler = this.ExpressionGenerated;
     handler(this, args);
 }