private static MethodBuilder EmitTupleEquals(TypeBuilder typeBuilder, MethodBuilder equalityMethod)
{
var equalsMethod = typeBuilder.DefineMethod("Equals", MethodAttributes.Virtual | MethodAttributes.Public | MethodAttributes.HideBySig | MethodAttributes.NewSlot, CallingConventions.HasThis, typeof(bool), new System.Type[] { typeof(object) });
var il = equalsMethod.GetILGenerator();
var baseLabel = il.DefineLabel();
var theEnd = il.DefineLabel();
il.Emit(OpCodes.Ldarg_1);
il.Emit(OpCodes.Isinst, typeBuilder);
il.Emit(OpCodes.Brfalse, baseLabel);
il.Emit(OpCodes.Ldarg_1);
il.Emit(OpCodes.Unbox_Any, typeBuilder);
il.Emit(OpCodes.Ldarg_0);
il.Emit(OpCodes.Ldobj, typeBuilder);
il.EmitCall(OpCodes.Call, equalityMethod, null);
il.Emit(OpCodes.Br_S, theEnd);
il.MarkLabel(baseLabel);
il.Emit(OpCodes.Ldarg_0);
il.Emit(OpCodes.Ldobj, typeBuilder);
il.Emit(OpCodes.Box, typeBuilder);
il.Emit(OpCodes.Ldarg_1);
il.EmitCall(OpCodes.Call, ReflectionUtility.ObjectEquals, null);
il.MarkLabel(theEnd);
il.Emit(OpCodes.Ret);
typeBuilder.DefineMethodOverride(equalsMethod, ReflectionUtility.ObjectEquals);
return equalsMethod;
}