Beispiel #1
0
            internal override Expression MakeCompareExpression(Expression lhs, Expression rhs)
            {
                var tProperty   = typeof(TProperty);
                var lhsProperty = GetProperty.MakeInvocation(lhs);
                var rhsProperty = GetProperty.MakeInvocation(rhs);

                if (Comparer == null)
                {
                    var compareTo = tProperty.GetMethod(
                        "CompareTo", new [] { tProperty }
                        );
                    if (compareTo != null)
                    {
                        return(Expression.Call(
                                   lhsProperty, compareTo, rhsProperty
                                   ));
                    }
                }

                var compare = RuntimeComparer.GetType().GetMethod("Compare", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);

                return(Expression.Call(
                           Expression.Constant(RuntimeComparer),
                           compare, lhsProperty, rhsProperty
                           ));
            }
Beispiel #2
0
            internal override Expression MakeCompareExpression(Expression lhs, Expression rhs)
            {
                var lhsTags = GetTags.MakeInvocation(lhs);
                var rhsTags = GetTags.MakeInvocation(rhs);

                var getSortKeys = Expression.Field(
                    Expression.Constant(this), GetType().GetField("SortKeys", BindingFlags.Instance | BindingFlags.NonPublic)
                    );
                var sortKeys = Expression.Variable(typeof(int[]), "sortKeys");

                var fId   = typeof(Tags).GetField("Id", BindingFlags.Instance | BindingFlags.Public);
                var lhsId = Expression.Field(lhsTags, fId);
                var rhsId = Expression.Field(rhsTags, fId);

                var lhsSortKey = Expression.ArrayIndex(sortKeys, lhsId);
                var rhsSortKey = Expression.ArrayIndex(sortKeys, rhsId);

                return(Expression.Block(
                           typeof(int),
                           new[] { sortKeys },
                           Expression.Assign(sortKeys, getSortKeys),
                           Expression.Subtract(lhsSortKey, rhsSortKey)
                           ));
            }