An example explains it best :
public interface IA {
void foo();
void bar();
}
public class A : IA {
public virtual void foo(){
Console.Write(\"foo\")
Looks like my guess was right.
I tried the same example, only this time creating the proxy directly from the class type:
Main(){
//proxy-ing an explicit type
A proxy = (A) new Castle.DynamicProxy.ProxyGenerator()
.CreateClassProxy(new Interceptor());
proxy.foo();
}
The result was what I expected in the first place:
Intercepted foo
foo
Intercepted bar
bar
This leads me to the following conclusion:
When creating an interface proxy with an interface implementation, the generated proxy looks something like this:
class InterfaceProxy: IA { //implements interface
IA m_impl;
[...]
Proxy(IA i_impl){
m_impl = i_impl;
}
public void foo(){
//overly-simplified, but you get the picture
InvokeInterceptors("foo");
//execution gets here when calling 'invocation.Proceed()'
//from the interceptor
m_impl.foo(); //pass the execution to the implementation;
//the proxy has no more control over what gets executed.
}
public void bar(){
InvokeInterceptors("bar");
m_impl.bar();
}
}
When creating a class proxy, the code looks like this:
class ClassProxy: A { //inherits class type
Proxy(): base() { ... }
public override void foo(){
InvokeInterceptors("foo");
//execution gets here when calling 'invocation.Proceed()'
//from the interceptor
base.foo(); //pass the execution to the base class
}
public void bar(){
InvokeInterceptors("bar");
base.bar();
}
}