У меня только что был очень интересный опыт работы с AOP на C#. У меня есть функция со списком типов возврата, которая перехватывается, и это все хорошо и хорошо. Однако функция перехвата является функцией стиля валидатора и может предотвратить реальную функцию, вызывая и возвращая булевую ложь.
Так что код выглядит немного так:
List<Update> updates = Manager.ValidateAndCreate();
// protected void Save(List<Update> updates) { ....
Save(updates);
Перехватчик методов выглядит следующим образом
public class ExceptionAdvice : AopAlliance.Intercept.IMethodInterceptor {
public object Invoke(AopAlliance.Intercept.IMethodInvocation invocation) {
if (isValid(invocation)) {
return invocation.Proceed();
} else {
return false;
}
}
private bool isValid( ...
}
Теперь после неудачи валидации значение обновлений на самом деле является булевым, а не списком, я думал, что здесь будет какая-нибудь ошибка во время выполнения, но ее не было, поэтому:
updates.GetType().Name == "Boolean"
Но:
updates is bool == false
Так что save все равно примет свой мутированный список обновлений и будет жаловаться позже, когда вы попытаетесь его использовать.
Как это возможно на таком безопасном языке, как C#? btw it's spring-aop.
Правка: Также он компилируется и работает, и я уже несколько раз проходил через него.