У меня только что был очень интересный опыт работы с AOP в C #. У меня есть функция с возвращаемым типом List, который перехватывается, и это все хорошо. Однако функция перехватчика является функцией стиля валидатора и может предотвратить реальную функцию, вызывая и возвращая логическое значение false.
Итак, код выглядит примерно так:
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 #? Кстати, это весна-уп.
Редактировать: Также это компилируется, и это работает, я прошел через это несколько раз.