从界面

时间:2017-12-07 14:48:32

标签: c# ninject castle-dynamicproxy

我正在拦截接口上的方法,因为我想确保我的预调用代码是针对任何给定实现的所有公共方法运行的。我知道我可以进行方法拦截,但这会使配置变得更加困难,并且未来可能会冒新方法的风险。

在运行时,我可以通过在invocation.Request.Target上调用GetType从IInvocation参数中获取实现的类。我找不到的是如何调用哪种方法。

一旦我有了类类型,我可能会按名称查询方法,但是我必须在查询参数的同时进行重载,如果可能的话我宁愿避免使用。

最终我试图从调用方法中拉出属性。因此,如果有快捷方式,那也可以。

编辑:我知道我可以将我的属性放在界面成员上(我现在正在做这个作为解决方法),但这不是我个案中的最终解决方案。

编辑2:请求的代码示例:

public class PublicBusinessInterceptor : SimpleInterceptor
{
    protected override void BeforeInvoke(IInvocation invocation)
    {
        var interfaceMemberType = invocation.Request.Target.GetType();
    }
}

在上面的代码示例中,interfaceMemberType是变量名称所暗示的接口成员的类型。我需要在此上下文中调用的已实现成员的类型。实现的成员类型具有我需要的属性。接口成员类型不是。

1 个答案:

答案 0 :(得分:0)

我不确定我理解你的问题,但据我了解,这可能是一个起点:

 public class MyInterceptor : IInterceptor
 {
     public void Intercept(IInvocation invocation)
     {
         // The intercepted method
         var method = invocation.Request.Method;

         // the method of the concrete type which is intercepted
         var actualMethod = invocation.Request.Target.GetType()
             .GetMethod(method.Name, method.GetParameters().Select(p => p.ParameterType).ToArray());

         // the desired attribute
         var myAttribute = actualMethod.GetCustomAttributes<MyAttribute>().FirstOrDefault();

         if (myAttribute == null)
        {
            invocation.Proceed();
        }
        else
        {
          // Do stuff
        }
     }