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 )); }
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) )); }