/// <summary>
 ///     Add a property value from a message to a projection
 /// </summary>
 /// <typeparam name="TMessage">A message type</typeparam>
 /// <typeparam name="TProjection">A projection type</typeparam>
 /// <typeparam name="TValue">A type of projection property</typeparam>
 /// <param name="source">An argument builder that contains resulting mapper</param>
 /// <param name="projectionProperty">An expression that identifies a projection property</param>
 /// <param name="getValue">A function to extract a value from a message</param>
 /// <returns>An argument builder that contains resulting mapper</returns>
 public static IRegisterMappers <TMessage, TProjection> Add <TMessage, TProjection, TValue>(
     this IRegisterMappers <TMessage, TProjection> source,
     Expression <Func <TProjection, TValue> > projectionProperty,
     Func <TMessage, TValue> getValue) where TValue : IComparable <TValue>
 {
     return(source.Do(ReflectionHelpers.CreateBinaryOperation(ExpressionType.Add, projectionProperty), getValue));
 }
 private static IRegisterMappers <TMessage, TProjection> Do <TMessage, TProjection, TValue>(
     this IRegisterMappers <TMessage, TProjection> source,
     Action <TProjection, TValue> action,
     Func <TMessage, TValue> getValue)
 {
     return(source.Do((e, p) => action(p, getValue(e))));
 }
 /// <summary>
 ///     Map a property from a message to a projection
 /// </summary>
 /// <typeparam name="TMessage">A message type</typeparam>
 /// <typeparam name="TProjection">A projection type</typeparam>
 /// <typeparam name="TValue">A type of projection property</typeparam>
 /// <param name="source">An argument builder that contains resulting mapper</param>
 /// <param name="projectionProperty">An expression that identifies a projection property</param>
 /// <param name="getValue">A function to extract a value from a message</param>
 /// <returns>An argument builder that contains resulting mapper</returns>
 public static IRegisterMappers <TMessage, TProjection> Map <TMessage, TProjection, TValue>(
     this IRegisterMappers <TMessage, TProjection> source,
     Expression <Func <TProjection, TValue> > projectionProperty,
     Func <TMessage, TValue> getValue)
 {
     return(source.Do(ReflectionHelpers.CreateSetOperation(projectionProperty), getValue));
 }
 /// <summary>
 ///     Set a property value
 /// </summary>
 /// <typeparam name="TMessage">A message type</typeparam>
 /// <typeparam name="TProjection">A projection type</typeparam>
 /// <typeparam name="TValue">A type of projection property</typeparam>
 /// <param name="source">An argument builder that contains resulting mapper</param>
 /// <param name="projectionProperty">An expression that identifies a projection property</param>
 /// <param name="value">A new value for the property</param>
 /// <returns>An argument builder that contains resulting mapper</returns>
 public static IRegisterMappers <TMessage, TProjection> Set <TMessage, TProjection, TValue>(
     this IRegisterMappers <TMessage, TProjection> source,
     Expression <Func <TProjection, TValue> > projectionProperty,
     TValue value)
 {
     return(source.Do((e, p) => ReflectionHelpers.CreateSetOperation(projectionProperty)(p, value)));
 }