/// <summary> /// Checks whether two given structural types are equal. /// </summary> /// <param name="x">The left type.</param> /// <param name="y">The right type.</param> /// <returns>true if the given types are equal, false otherwise.</returns> protected virtual bool EqualsStructural(Type x, Type y) { if (TypeMap.TryGetValue(x, out Type res)) { return(res.Equals(y)); } else { TypeMap[x] = y; } var xMembers = x.GetMembers(); var yMembers = y.GetMembers(); if (xMembers.Length != yMembers.Length) { TypeMap.Remove(x); return(false); } foreach (var xMember in xMembers) { if (MemberComparer.ResolveMember(y, xMember) == null) { TypeMap.Remove(x); return(false); } } return(true); }