private static BinaryExpression CallComparerIfAvailable(Expression comparers, Type memberType, Expression xPropertyOrField, Expression yPropertyOrField) { //(comparers.ContainsKey(memberType) && ((IEqualityComparer<memberType>)comparers[memberType]).Equals(x, y)) return(BinaryExpression.AndAlso( Expression.Call(comparers, "ContainsKey", null, Expression.Constant(memberType, typeof(Type))), Expression.Call(Expression.TypeAs( Expression.MakeIndex(comparers, typeof(IDictionary <Type, IEqualityComparer>).GetProperty("Item", typeof(IEqualityComparer), new[] { typeof(Type) }), new[] { Expression.Constant(memberType, typeof(Type)) }), typeof(IEqualityComparer <>).MakeGenericType(memberType)), "Equals", null, xPropertyOrField, yPropertyOrField))); }