private void InvokeSet(PropertyInfo propertyInfo) { var propertyType = propertyInfo.PropertyType; il.Emit(OpCodes.Ldloc, item); il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Ldloc, field); if (DataReaderMethodMap.TryGetValue(propertyInfo.PropertyType, out MethodInfo getMethod)) { il.Emit(OpCodes.Callvirt, getMethod); } else { il.Emit(OpCodes.Callvirt, getItemMethod); il.Emit(OpCodes.Castclass, propertyInfo.PropertyType); } if (propertyType.IsGenericType && propertyType.GetGenericTypeDefinition().Equals(typeof(Nullable <>)) ) { var propetyType = propertyInfo.PropertyType; var constructor = propetyType.GetConstructor(new Type[] { propetyType.GetGenericArguments()[0] }); il.Emit(OpCodes.Newobj, constructor); } il.Emit(OpCodes.Callvirt, propertyInfo.GetSetMethod(true)); }
private void SimpleProperty(ParameterInfo parameter, PropertyInfo propertyInfo, int currentIndex) { Label endLabel = il.DefineLabel(); Label defaultLabel = il.DefineLabel(); //var field = fields[index]; il.Emit(OpCodes.Ldarg_1); il.Emit(OpCodes.Ldc_I4, currentIndex); il.Emit(OpCodes.Ldelem_I4); il.Emit(OpCodes.Stloc, field); //if(field >= 0) il.Emit(OpCodes.Ldloc, field); il.Emit(OpCodes.Ldc_I4_0); il.Emit(OpCodes.Blt_S, defaultLabel); var propertyType = propertyInfo.PropertyType; //if(!reader.IsDBNull(field)) il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Ldloc, field); il.Emit(OpCodes.Callvirt, SupportMembers.DataReader.IsDBNull); il.Emit(OpCodes.Ldc_I4_0); il.Emit(OpCodes.Ceq); il.Emit(OpCodes.Brfalse_S, defaultLabel); il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Ldloc, field); if (DataReaderMethodMap.TryGetValue(propertyInfo.PropertyType, out MethodInfo getMethod)) { il.Emit(OpCodes.Callvirt, getMethod); } else { il.Emit(OpCodes.Callvirt, getItemMethod); il.Emit(OpCodes.Castclass, propertyInfo.PropertyType); } if (propertyType.IsGenericType && propertyType.GetGenericTypeDefinition().Equals(typeof(Nullable <>))) { var propetyType = propertyInfo.PropertyType; var constructor = propetyType.GetConstructor(new Type[] { propetyType.GetGenericArguments()[0] }); il.Emit(OpCodes.Newobj, constructor); } il.Emit(OpCodes.Br_S, endLabel); il.MarkLabel(defaultLabel); Default(parameter.ParameterType); il.MarkLabel(endLabel); }