На основе Comparer GenericTypeTea: мы можем получить большую гибкость, добавив флаги сортировки:
public class MyOrderingClass : IComparer<Order> {
public int Compare(Order x, Order y) {
int compareDate = x.Date.CompareTo(y.Date);
if (compareDate == 0) {
int compareOrderId = x.OrderID.CompareTo(y.OrderID);
if (OrderIdDescending) {
compareOrderId = -compareOrderId;
}
return compareOrderId;
}
if (DateDescending) {
compareDate = -compareDate;
}
return compareDate;
}
public bool DateDescending { get; set; }
public bool OrderIdDescending { get; set; }
}
В этом сценарии вы должны создать экземпляр как MyOrderingClass явно (а не IComparer), чтобы установить его сортировку свойства:
MyOrderingClass comparer = new MyOrderingClass();
comparer.DateDescending = ...;
comparer.OrderIdDescending = ...;
orderList.Sort(comparer);
Googling в течение часа или около того этой статьи вверх, который, кажется, полностью отвечает на мой вопрос: используйте ASM . Для записи файлов классов с использованием измененного байт-кода используйте ClassWriter .
Ну, время, чтобы работать, я думаю. :)
На самом деле, это классический прецедент для AspectJ:
declare @method : public * BankAccount+.*(..) : @Secured(role="supervisor")
Пока я дам вам, что манипуляция с прямым байтовым кодом более мощная, AspectJ гораздо удобнее, и он сразу дает вы компилируете предупреждения, когда вы делаете что-то неправильно.
Кроме того, если вы используете Load Time Weaving , вы можете оставить исходную библиотеку jar неизменной, потому что плетение происходит при загрузке класса
Ссылка: