public class MyInterceptor : IInterceptor<MyType>
{
public void InterceptGetter(IProxy proxy, MyType @object, string propertyName, out object value)
{
// do something before get
proxy.ProceedGetter(propertyName, out value);
// do something after get
}
public void InterceptSetter(IProxy proxy, MyType @object, string propertyName, object value)
{
// do something before set
proxy.ProceedSetter(propertyName, value);
// do something after set
m_setterCalled = true;
}
private bool m_setterCalled = false;
public bool SetterWasCalled
{
get { return m_setterCalled; }
}
}
public class MyType
{
public virtual string Property { get; set; }
}
/////// AUTOGENERATED PROXY ///////
public class MyTypeProxy : MyType, IProxy
{
private MyType m_object;
private IInterceptor<MyType> m_interceptor;
public MyTypeProxy(MyType @object, IInterceptor<MyType> interceptor)
{
m_object = @object;
m_interceptor = interceptor;
}
public override string Property
{
get
{
object value;
m_interceptor.InterceptGetter(this, m_object, "Property", out value);
return (string)value;
}
set { m_interceptor.InterceptSetter(this, m_object, "Property", value); }
}
public void ProceedGetter(string propertyName, out object value)
{
if (propertyName == "Property")
{
value = m_object.Property;
}
else
{
throw new MissingMemberException
();
}
}
public void ProceedSetter(string propertyName, object value)
{
if (propertyName == "Property")
{
m_object.Property = (string)value;
}
else
{
throw new MissingMemberException
();
}
}
}
/////// SUPPORTING CODE ///////
public interface IProxy
{
void ProceedGetter(string propertyName, out object value);
void ProceedSetter(string propertyName, object value);
}
public interface IInterceptor<T>
{
void InterceptGetter(IProxy proxy, T @object, string propertyName, out object value);
void InterceptSetter(IProxy proxy, T @object, string propertyName, object value);
}
/////// TEST ///////
public static class Test
{
public static void ProxyTest()
{
var myType =
new MyType
();
myType.Property = "Test";
var interceptor =
new MyInterceptor
();
MyType wrappedMyType = GenerateProxy(myType, interceptor);
wrappedMyType.Property = "Test2";
Debug.Assert(myType.Property == "Test2");
Debug.Assert(interceptor.SetterWasCalled);
}
// This method belongs in a proxy generator
private static MyType GenerateProxy(MyType myType, IInterceptor<MyType> interceptor)
{
return new MyTypeProxy
(myType, interceptor
);
}
}