private void EmitGetHashCode(PropertyAndField[] properties, MethodBuilder method) { MethodInfo methodInfo = ObjectType.GetMethod("GetHashCode", Type.EmptyTypes); ILGenerator iLGenerator = method.GetILGenerator(); iLGenerator.Emit(OpCodes.Ldc_I4, method.GetHashCode()); int index = 0; if (0 < properties.Length) { do { PropertyAndField field = properties[index]; FieldBuilder builder = field.Field; if (!field.Property.CanWrite) { iLGenerator.Emit(OpCodes.Ldc_I4, 0x1f); iLGenerator.Emit(OpCodes.Mul); Label label = iLGenerator.DefineLabel(); iLGenerator.Emit(OpCodes.Ldarg_0); iLGenerator.Emit(OpCodes.Ldfld, builder); iLGenerator.Emit(OpCodes.Box, builder.FieldType); iLGenerator.Emit(OpCodes.Brfalse_S, label); iLGenerator.Emit(OpCodes.Ldarg_0); iLGenerator.Emit(OpCodes.Ldflda, builder); iLGenerator.Emit(OpCodes.Constrained, builder.FieldType); iLGenerator.EmitCall(OpCodes.Callvirt, methodInfo, null); iLGenerator.Emit(OpCodes.Add); iLGenerator.MarkLabel(label); } index++; } while (index < properties.Length); } iLGenerator.Emit(OpCodes.Ret); }