private static bool TryGenerateForEnumerable(Type type, ref EqualityFunction <T> result)
        {
            if (type.CustomAttributes.OfType <NotEnumerableComparisonAttribute>().Any())
            {
                return(false);
            }

            Type enumerableInterface =
                type.GetInterfaces()
                .Concat(new[] { type })//this one handles the case where type is IEnumerable itself
                .Where(x => x.IsGenericType && x.GetGenericTypeDefinition() == typeof(IEnumerable <>))
                .FirstOrDefault();

            if (enumerableInterface == null)
            {
                return(false);
            }

            Type itemType = enumerableInterface.GetGenericArguments().Single();

            ParameterExpression left  = Expression.Parameter(type, "x");
            ParameterExpression right = Expression.Parameter(type, "y");

            result = Expression.Lambda <EqualityFunction <T> >(
                Expression.Call(
                    instance: null,
                    method: NotEquals.GetSequenceNotEqualMethod(itemType, type),
                    arguments: new[] { left, right }
                    ),
                left,
                right
                ).Compile();
            return(true);
        }
        private static bool TryGenerateForIEquatable(Type type, ref EqualityFunction <T> result)
        {
            Type equatableInterface = typeof(IEquatable <>).MakeGenericType(type);
            bool implements         = type.GetInterfaces().Any(x => x == equatableInterface);

            if (!implements)
            {
                return(false);
            }

            if (type.GetCustomAttributes <EquatableDependsOnLazyComparisonAttribute>().Any())
            {
                return(false);
            }

            ParameterExpression left  = Expression.Parameter(type, "x");
            ParameterExpression right = Expression.Parameter(type, "y");

            MethodInfo compareMethod = NotEquals.GetEquatableCompareMethod(type);

            result = Expression.Lambda <EqualityFunction <T> >(
                Expression.Call(
                    instance: null,
                    method: NotEquals.GetEquatableCompareMethod(type),
                    arguments: new[] { left, right }
                    ),
                parameters: new[] { left, right }
                ).Compile();

            return(true);
        }