private DynamicMethod CreateDynamicMethod() { DynamicMethod dm = new DynamicMethod("ObjectFromDataReader<" + this.entityType.FullName + ">", typeof(object), new Type[] { typeof(IDataReader) }); cil = dm.GetILGenerator(); // T entity = new T(); LocalBuilder entityVar = cil.DeclareLocal(this.entityType); cil.Emit(OpCodes.Newobj, this.entityType.GetConstructor(emptyTypeArray)); cil.Emit(OpCodes.Stloc_0); var properties = entityType.GetProperties().ToDictionary(x => x.Name); var columnToPropertyMap = EntityMetadata.GetEntityMetadata(entityType)?.ColumnToPropertyMap; int fieldCount = reader.FieldCount; for (int fieldOrdinal = 0; fieldOrdinal < fieldCount; fieldOrdinal++) { string fieldName = reader.GetName(fieldOrdinal); if (TryFindMappingProperty(columnToPropertyMap, properties, fieldName, out PropertyInfo pi)) { EmitCilForOneField(fieldOrdinal, pi); } } // return entity; cil.Emit(OpCodes.Ldloc_0); cil.Emit(OpCodes.Ret); return(dm); }
public static EntityMetadata GetEntityMetadata(this Type entityType) { return(EntityMetadata.GetEntityMetadata(entityType)); }