private CloneDelegate <TEntity> AssembleExpression <TEntity>(IExpressionBuilder expressionBuilder) where TEntity : class { CloneExpressionContext context = new CloneExpressionContext { SourceEntity = expressionBuilder.AddParameter <TEntity>(nameof(CloneExpressionContext.SourceEntity)), CloneFactory = expressionBuilder.AddParameter <ICloneFactory>(nameof(CloneExpressionContext.CloneFactory)), }; if (CollectionTypes.Any(collectionType => IsCollectionType(collectionType, typeof(TEntity)))) { AddCollectionExpressions <TEntity>(expressionBuilder, context); } else { AddCloneExpressions <TEntity>(expressionBuilder, context); } expressionBuilder.ReturnObject(context.TargetEntity); return(expressionBuilder.Build <CloneDelegate <TEntity> >()); }