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); }
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++; } } } }