4

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;

}

SteveC
  • 15,808
  • 23
  • 102
  • 173
Jeff
  • 35,755
  • 15
  • 108
  • 220

1 Answers1

4

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.

SteveC
  • 15,808
  • 23
  • 102
  • 173
Krzysztof Kozmic
  • 27,267
  • 12
  • 73
  • 115