Получить реализованный метод при перехвате с интерфейса
Я перехватываю методы в интерфейсе, потому что хочу быть уверенным, что мой код перед вызовом выполняется для всех открытых методов любой данной реализации. Я знаю, что мог бы перехватывать методы, но это усложняет настройку и рискует, что новые методы в будущем не будут настроены.
Во время выполнения я могу получить реализованный класс из аргумента 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
}
}