我刚刚在 C# 中使用 AOP 获得了非常有趣的体验。我有一个返回类型 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# 这样的类型安全语言中怎么可能呢?顺便说一句,这是spring-aop。
编辑:这也确实编译并且它确实有效,我已经通过它几次了。