Exemple #1
0
        private static void ReadObject(ILGenerator il, LocalBuilder bindingInstance, LocalBuilder sqlDataReader, int fieldIndex, FieldInfo targetField)
        {
            LocalBuilder localBuilder = SqlProcedureLinker.NewInstance(il, targetField.FieldType);

            SqlProcedureLinker.BindField(il, bindingInstance, targetField, localBuilder);
            SqlProcedureLinker.ReadFields(il, targetField.FieldType, localBuilder, sqlDataReader, fieldIndex);
        }
Exemple #2
0
 private static void ReadFields(ILGenerator il, Type bindingType, LocalBuilder bindingInstance, LocalBuilder sqlDataReader, int fieldIndex)
 {
     if (bindingType.BaseType != null && bindingType.BaseType != typeof(object) && !bindingType.IsValueType)
     {
         SqlProcedureLinker.ReadFields(il, bindingType.BaseType, bindingInstance, sqlDataReader, fieldIndex);
     }
     foreach (FieldInfo fieldInfo in bindingType.GetFields(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic))
     {
         Type fieldType = fieldInfo.FieldType;
         if ((fieldInfo.GetCustomAttributes(false).Length <= 0 || !(fieldInfo.GetCustomAttributes(false)[0].GetType() == typeof(SqlReturnAttribute))) && !fieldType.IsInterface && !fieldType.IsAbstract && !fieldInfo.IsInitOnly && !fieldInfo.IsLiteral && !fieldType.IsByRef)
         {
             if (fieldType.IsArray)
             {
                 Label label = il.DefineLabel();
                 il.Emit(OpCodes.Ldloc, sqlDataReader);
                 il.Emit(OpCodes.Call, typeof(SqlDataReader).GetMethod("NextResult"));
                 il.Emit(OpCodes.Brfalse, label);
                 Type         elementType  = fieldType.GetElementType();
                 LocalBuilder local        = SqlProcedureLinker.ReadList(il, elementType, sqlDataReader, 0);
                 LocalBuilder localBuilder = il.DeclareLocal(elementType.MakeArrayType());
                 il.Emit(OpCodes.Ldloc, local);
                 il.Emit(OpCodes.Call, typeof(List <>).MakeGenericType(new Type[]
                 {
                     elementType
                 }).GetMethod("ToArray"));
                 il.Emit(OpCodes.Stloc, localBuilder);
                 SqlProcedureLinker.BindField(il, bindingInstance, fieldInfo, localBuilder);
                 il.MarkLabel(label);
             }
             else if (SqlProcedureLinker.IsGenericCollection(fieldType))
             {
                 Label label2 = il.DefineLabel();
                 il.Emit(OpCodes.Ldloc, sqlDataReader);
                 il.Emit(OpCodes.Call, typeof(SqlDataReader).GetMethod("NextResult"));
                 il.Emit(OpCodes.Brfalse, label2);
                 Type         elementType2 = fieldType.GetGenericArguments()[0];
                 LocalBuilder sourceField  = SqlProcedureLinker.ReadList(il, elementType2, sqlDataReader, 0);
                 SqlProcedureLinker.BindField(il, bindingInstance, fieldInfo, sourceField);
                 il.MarkLabel(label2);
             }
             else if (!fieldType.IsPrimitive && fieldType != typeof(string))
             {
                 SqlProcedureLinker.ReadObject(il, bindingInstance, sqlDataReader, fieldIndex, fieldInfo);
             }
             else
             {
                 SqlProcedureLinker.ReadField(il, bindingInstance, sqlDataReader, fieldIndex, fieldInfo);
                 fieldIndex++;
             }
         }
     }
 }