Ejemplo n.º 1
0
 /// <summary>
 /// Builds a deserializer.
 /// </summary>
 /// <param name="resultType">Type of the result.</param>
 /// <param name="mappings">The mappings.</param>
 /// <returns>IEnumerable&lt;TResult&gt;.</returns>
 public IDeserializer BuildDeserializer(Type resultType, IMappingExport mappings)
 {
     return(new KeyValuePairDeserializer(mappings, resultType));
 }
 /// <summary>
 /// Builds a deserializer.
 /// </summary>
 /// <typeparam name="TResult">The type of the result.</typeparam>
 /// <param name="mappings">The mappings.</param>
 /// <returns>IEnumerable&lt;TResult&gt;.</returns>
 public IDeserializer <TResult> BuildDeserializer <TResult>(IMappingExport mappings)
 {
     return(new Deserializer <TResult>(Deserialize <TResult>));
 }
Ejemplo n.º 3
0
 /// <summary>
 /// Builds a deserializer.
 /// </summary>
 /// <typeparam name="TResult">The type of the result.</typeparam>
 /// <param name="mappings">The mappings.</param>
 /// <returns>IEnumerable&lt;TResult&gt;.</returns>
 public IDeserializer <TResult> BuildDeserializer <TResult>(IMappingExport mappings)
 {
     return(new KeyValuePairDeserializer <TResult>(mappings));
 }
Ejemplo n.º 4
0
 /// <summary>
 /// Initializes a new instance of the <see cref="ComplexTypeDeserializer"/> class.
 /// </summary>
 /// <param name="mappings">The mappings.</param>
 /// <param name="type">The type.</param>
 /// <param name="compiledMap">The compiled mapping operations.</param>
 public ComplexTypeDeserializer(IMappingExport mappings, Type type, Func<IDataReader, ColumnChecker, object> compiledMap)
 {
     _mappings = mappings;
     _compiledMap = compiledMap;
     DeserializationType = type;
 }
Ejemplo n.º 5
0
 /// <summary>
 /// Initializes a new instance of the <see cref="KeyValuePairDeserializer" /> class.
 /// </summary>
 /// <param name="mappings">The mappings.</param>
 /// <param name="type">The type.</param>
 public KeyValuePairDeserializer(IMappingExport mappings, Type type)
 {
     DeserializationType = type;
     _props = mappings.Export();
 }
        /// <summary>
        /// Compiles mappings.
        /// </summary>
        /// <returns>Func&lt;DbDataReader, ColumnChecker, IEnumerable&lt;System.Object&gt;&gt;.</returns>
        public static Func <DbDataReader, ColumnChecker, object> Compile(string cacheKey, IMappingExport mapping, Type resultType)
        {
            //Get the properties we care about.
            var mappings = mapping.Export();

            var statements = new List <Expression>();

            var reader       = Expression.Parameter(typeof(DbDataReader), "reader");
            var columnReport = Expression.Parameter(typeof(ColumnChecker), "columnReport");

            var columnChecker = Expression.Variable(typeof(ColumnChecker), "columnChecker");

            // columnChecker = (columnReport == null) ? new ColumnChecker() : columnReport;
            statements.Add(Expression.IfThenElse(Expression.Equal(columnReport, Expression.Constant(null)),
                                                 Expression.Assign(
                                                     columnChecker, Expression.New(ColumnCheckerConstructorInfo,
                                                                                   Expression.Convert(Expression.Property(Expression.Convert(reader, typeof(DbDataReader)), "FieldCount"), typeof(int?)))),
                                                 Expression.Assign(columnChecker, columnReport)));

            // var descriptor;
            var descriptor = Expression.Variable(resultType, "descriptor");

            // descriptor = new TResult();
            statements.Add(Expression.Assign(
                               descriptor, Expression.New(resultType)));

            // ReSharper disable once LoopCanBeConvertedToQuery
            foreach (var pair in mappings)
            {
                #region locals

                //These are local variables inside of a block. Similar to defining variables inside an if.

                //var ex;
                var ex = Expression.Variable(typeof(Exception), "ex");
                //var ordinal;
                var ordinal = Expression.Variable(typeof(int), "ordinal");

                #endregion locals

                statements.Add(
                    Expression.Block(new[] { /* LOCAL */ ordinal },

                                     // ordinal = columnChecker.HasColumn(pair.Value.ActiveAlias);
                                     Expression.Assign(ordinal,
                                                       Expression.Call(columnChecker,
                                                                       typeof(ColumnChecker).GetTypeInfo().GetMethod("HasColumn",
                                                                                                                     new[] { typeof(DbDataReader), typeof(string) }),
                                                                       reader,
                                                                       Expression.Constant(pair.Value.ActiveAlias))),

                                     // if(ordinal > 0 && !reader.IsDBNull(ordinal))
                                     Expression.IfThen(
                                         Expression.AndAlso(
                                             Expression.IsTrue(
                                                 Expression.GreaterThanOrEqual(ordinal, Expression.Constant(0))),
                                             Expression.IsFalse(
                                                 Expression.Call(reader, typeof(DbDataReader).GetTypeInfo().GetMethod("IsDBNull"), ordinal))),
                                         // try
                                         Expression.TryCatch(
                                             Expression.Block(typeof(void),

                                                              //Assignment Expression
                                                              Expression.Invoke(
                                                                  pair.Value.AssembleMappingExpression(
                                                                      Expression.Property(descriptor, pair.Value.PropertyMetadata)),
                                                                  reader, ordinal)),
                                             // catch
                                             Expression.Catch(
                                                 /* Exception being caught is assigned to ex */ ex,
                                                 Expression.Block(typeof(void),

                                                                  //throw new ColumnBindingException("...", ex);
                                                                  Expression.Throw(
                                                                      Expression.New(ColumnBindingException.MessageAndInnerExceptionConstructorInfo,
                                                                                     Expression.Constant(pair.Value.PropertyMetadata.Name +
                                                                                                         " encountered an exception on column [" +
                                                                                                         pair.Value.ActiveAlias + "] when binding"
                                                                                                         + " into property " +
                                                                                                         pair.Value.PropertyMetadata.Name +
                                                                                                         " which is CLR type of "
                                                                                                         + pair.Value.PropertyMetadata.PropertyType.Name +
                                                                                                         "."),
                                                                                     ex
                                                                                     ))))))));
            }

            statements.Add(descriptor);

            var body   = Expression.Block(new[] { columnChecker, descriptor }, statements);
            var lambda = Expression.Lambda <Func <DbDataReader, ColumnChecker, object> >(body, reader,
                                                                                         columnReport);



#if !DOTNETCORE
            var type = SusanooCommander.DynamicNamespace
                       .DefineType(string.Format(CultureInfo.CurrentCulture, "{0}_{1}",
                                                 resultType.Name, cacheKey));

            var methodBuilder = type.DefineMethod("MapResult", MethodAttributes.Public | MethodAttributes.Static);

            lambda.CompileToMethod(methodBuilder);

            var dynamicType = type.CreateType();

            return((Func <DbDataReader, ColumnChecker, object>)Delegate
                   .CreateDelegate(typeof(Func <DbDataReader, ColumnChecker, object>),
                                   dynamicType.GetMethod("MapResult", BindingFlags.Public | BindingFlags.Static)));
#else
            Func <DbDataReader, ColumnChecker, object> method = lambda.Compile();
            return(method);
#endif
        }
Ejemplo n.º 7
0
 /// <summary>
 /// Builds a deserializer.
 /// </summary>
 /// <param name="resultType">Type of the result.</param>
 /// <param name="mappings">The mappings.</param>
 /// <returns>IEnumerable&lt;TResult&gt;.</returns>
 public IDeserializer BuildDeserializer(Type resultType, IMappingExport mappings)
 {
     return(new Deserializer(resultType, Deserialize));
 }