gpt4 book ai didi

C# 和 AOP - AOPAlliance(面向方面​​的编程)这是如何工作的

转载 作者:太空狗 更新时间:2023-10-29 21:36:01 25 4
gpt4 key购买 nike

我刚刚对 C# 中的 AOP 有了非常有趣的体验。我有一个返回类型为 List 的函数,它被拦截了,这一切都很好。然而,拦截器函数是一个验证器样式函数,可以通过调用并返回 bool 值 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( ...
}

现在验证失败后更新的值实际上是一个 bool 值而不是列表,我认为这里会有某种运行时错误但没有,所以:

updates.GetType().Name == "Boolean"

但是:

updates is bool == false

因此 save 仍将接受其更新的变异列表,并在您尝试使用它时稍后提示。

那么在像 C# 这样的类型安全语言中,这怎么可能呢?顺便说一句,这是 spring-aop。

编辑:此外,它确实可以编译并且确实有效,我现在已经逐步完成了几次。

最佳答案

我相信这是可能的,因为 Spring.Net 在运行时发出代理类,跳过编译时类型检查。

它本质上实现了一个装饰器模式包装原始类并动态生成一个新的方法实现。在动态生成的代理方法中,可以在编写 IL 时更改返回类型,而 .NET 允许这样做,因为它不会在运行时检查类型。当然在编译时它也仍然完全有效。这导致了上面相当奇怪的场景,即您的静态类型实际上与运行时类型不同。

以下是正确的,因为它正在检查实际的运行时类型,在某些情况下可以解析为 bool 值。

updates.GetType().Name == "Boolean"

但下面的代码失败了,因为它将变量的静态类型与 bool 值进行比较,而事实并非如此。

updates is bool == false

我建议您不要在 Invoke 中更改类型。

关于C# 和 AOP - AOPAlliance(面向方面​​的编程)这是如何工作的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7200572/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com