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;
}
Krzysztof Kozmic
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.
来源:https://stackoverflow.com/questions/2959812/intercept-properties-with-castle-windsor-iinterceptor