Question

Does anyone have a suggestion on a better way to intercept a properties with Castle DynamicProxy?

Specifically, I need the PropertyInfo that I'm intercepting, but it's not directly on the IInvocation, so what I do is:

public static PropertyInfo GetProperty(this MethodInfo method)
{
    bool takesArg = method.GetParameters().Length == 1;
    bool hasReturn = method.ReturnType != typeof(void);
    if (takesArg == hasReturn) return null;
    if (takesArg)
    {
        return method.DeclaringType.GetProperties()
            .Where(prop => prop.GetSetMethod() == method).FirstOrDefault();
    }
    else
    {
        return method.DeclaringType.GetProperties()
            .Where(prop => prop.GetGetMethod() == method).FirstOrDefault();
    }
}

Then in my IInterceptor:

public void Intercept(IInvocation invocation)
{
    bool doSomething = invocation.Method
                                 .GetProperty()
                                 .GetCustomAttributes(true)
                                 .OfType<SomeAttribute>()
                                 .Count() > 0;

}

Was it helpful?

Solution

Generally this is not available. DynamicProxy intercepts methods (incl. getters and setters), and it does not care about properties.

You could optimize this code a bit by making the interceptor IOnBehalfAware (see here) and discovering the method->property mapping upfront.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top