我在使用Castle的动态代理时遇到了一些(我认为是)奇怪的行为。
以下是代码:
以下是代码:
class Program
{
static void Main(string[] args)
{
var c = new InterceptedClass();
var i = new Interceptor();
var cp = new ProxyGenerator().CreateClassProxyWithTarget(c, i);
cp.Method1();
cp.Method2();
Console.ReadLine();
}
}
public class Interceptor : IInterceptor
{
public void Intercept(IInvocation invocation)
{
Console.WriteLine(string.Format("Intercepted call to: " + invocation.Method.Name));
invocation.Proceed();
}
}
public class InterceptedClass
{
public virtual void Method1()
{
Console.WriteLine("Called Method 1");
Method2();
}
public virtual void Method2()
{
Console.WriteLine("Called Method 2");
}
}
我预期的输出结果是:
- 拦截到方法调用: Method1
- 调用了方法 1
- 拦截到方法调用: Method2
- 调用了方法 2
- 拦截到方法调用: Method2
- 调用了方法 2
但是实际得到的却是:
- 拦截到方法调用: Method1
- 调用了方法 1
- 调用了方法 2
- 拦截到方法调用: Method2
- 调用了方法 2
据我所知,动态代理只能代理从类外部发起的方法调用,因此当从InterceptedClass内部调用Method2时,它并没有被代理。我可以理解在从代理类内部进行调用时,它不再通过代理进行调用。但我想确认一下这是否是预期的行为,如果是的话,是否有任何方法可以拦截所有的方法调用,而不考虑它们来自哪里?
谢谢!