私はC#でAOPを使って非常に興味深い経験をしました。インターセプトされているリターンタイプのリストを持つ関数があり、それはすべてうまくいっています。ただし、インターセプター関数はバリデータースタイルの関数であり、呼び出されてブール値の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#のようなタイプセーフな言語でどのように可能でしょうか?ところで、それは春のAOPです。
編集:また、これはコンパイルされ、動作します。私はこれを数回ステップスルーしました。