Получить реализованный метод при перехвате с интерфейса

Я перехватываю методы в интерфейсе, потому что хочу быть уверенным, что мой код перед вызовом выполняется для всех открытых методов любой данной реализации. Я знаю, что мог бы перехватывать методы, но это усложняет настройку и рискует, что новые методы в будущем не будут настроены.

Во время выполнения я могу получить реализованный класс из аргумента IInvocation, вызвав GetType для invocation.Request.Target. Что я не могу найти, так это как узнать, какой метод вызывается.

После того, как у меня будет тип класса, я, вероятно, смогу запросить метод по имени, но тогда мне придется также приступить к запросам параметров в случае перегрузок, и я бы предпочел избежать этого, если это возможно.

В конечном итоге я пытаюсь извлечь атрибуты из вызывающего метода. Так что если есть ярлык, это тоже сработает.

РЕДАКТИРОВАТЬ: Я знаю, что я могу поставить свои атрибуты на членов интерфейса (я делаю это сейчас как обходной путь), но это не может быть окончательным решением в моем случае.

РЕДАКТИРОВАТЬ 2: Пример запрашиваемого кода:

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

В приведенном выше примере кода interfaceMemberType это, как следует из имени переменной, тип элемента интерфейса. Мне нужен тип реализованного члена, который вызывается в этом контексте. Реализованный тип члена имеет атрибуты, которые мне нужны. Тип члена интерфейса нет.

1 ответ

Не уверен, что понимаю ваш вопрос, но, насколько я понимаю, это может быть отправной точкой:

 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
        }
     }
Другие вопросы по тегам