拦截城堡温莎IInterceptor的属性

时间:2010-06-02 16:57:59

标签: castle-windsor dynamic-proxy iinterceptor

是否有人建议使用Castle DynamicProxy更好地拦截属性?

具体来说,我需要我正在拦截的PropertyInfo,但它不是直接在IInvocation上,所以我所做的是:

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();
    }
}

然后在我的IInterceptor中:

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

}

1 个答案:

答案 0 :(得分:3)

通常这不可用。 DynamicProxy拦截方法(包括getter和setter),它不关心属性。

您可以通过制作拦截器IOnBehalfAware(请参阅here)并预先发现method-&gt;属性映射来优化此代码。