19

私はこのような例を書きました

シンプルな電卓クラス:

public class Calculator
{
    public int Add(int a, int b)
    {
        return a + b;
    }
}

DynamicProxy が提供する「IInterceptor」を実装

 [Serializable]
public abstract class Interceptor : IInterceptor
{
    public void Intercept(IInvocation invocation)
    {
        ExecuteBefore(invocation);
        invocation.Proceed();
        ExecuteAfter(invocation);

    }
    protected abstract void ExecuteAfter(IInvocation invocation);
    protected abstract void ExecuteBefore(IInvocation invocation);
}

Interceptor クラスを作成し、「Interceptor」クラスから継承

    public class CalculatorInterceptor : Interceptor
{
    protected override void ExecuteBefore(Castle.DynamicProxy.IInvocation invocation)
    {
        Console.WriteLine("Start");
    }

    protected override void ExecuteAfter(Castle.DynamicProxy.IInvocation invocation)
    {
        Console.WriteLine("End");
    }
}

しかし、私がそれを使用したときは機能しませんでした!!!

static void Main(string[] args)
    {
        ProxyGenerator generator = new ProxyGenerator();
        Calculator c = generator.CreateClassProxy<Calculator>(new CalculatorInterceptor());
        var r = c.Add(11, 22);
        Console.WriteLine(r);
        Console.ReadKey();
    }

私はこのようなものを見ることを除いて:

START
33
END

しかし、表示のみ

33

どうすれば修正できますか?

4

3 に答える 3

21

メソッドをAdd仮想化してみてください。

public class Calculator
{
    public virtual int Add(int a, int b)
    {
        return a + b;
    }
}

プロキシ ジェネレータは、 を継承する新しいクラスを作成しますCalculator。したがって、メソッドAddはオーバーライドを取得して傍受を可能にします。

于 2015-02-14T19:06:54.240 に答える