Как перехватить методы с помощью DispatchProxy, которые подписали пользовательский атрибут?C#

Место общения программистов C#
Anonymous
Как перехватить методы с помощью DispatchProxy, которые подписали пользовательский атрибут?

Сообщение Anonymous »

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

Код: Выделить всё

    public abstract class InterceptorProxy: DispatchProxy
{
private T? _decorated;

protected override object? Invoke(MethodInfo? targetMethod, object?[]? args)
{
try
{
OnBefore(targetMethod,args);

var result = targetMethod?.Invoke(_decorated, args);

OnAfter(targetMethod, args, result);

return result;
}
catch (TargetInvocationException e)
{
OnException(targetMethod, args, e);
throw;
}
}

public static T? Create(T decorated)
{
object? proxy = Create();
((InterceptorProxy)proxy!)?.SetParameters(decorated);

return (T)proxy!;
}

private void SetParameters(T decorated)
{
_decorated = decorated ?? throw new ArgumentNullException(nameof(decorated));
}

protected virtual void OnException(MethodInfo? methodInfo, object?[]? args, Exception exception) { }
protected virtual void OnAfter(MethodInfo? methodInfo, object?[]? args, object? result) { }
protected virtual void OnBefore(MethodInfo? methodInfo, object?[]? args) { }
}
И у меня есть собственный атрибут для подписи моих методов.

Код: Выделить всё

public class DispachedAttribute : Attribute
{
public string Type { get; set; }
public DispatchedAttribute(string type)
{
Type = type;
}
}
И я хочу перехватить методы, которые подписаны только этим атрибутом.
в контроллере:

Код: Выделить всё

[Dispached("POST")]
public ResponseDTO Run(RequestDTO requestDTO)
{
var result = service.Get(requestDTO);
return result;
}
в любом классе:

Код: Выделить всё

public class myclass{
[Dispached("Do")]
public string Run(string param)
{
// do something
return param;
}
}
Мой перехватчик должен автоматически сработать при запуске этого метода. Как мне это сделать?

Подробнее здесь: https://stackoverflow.com/questions/783 ... -attribute

Вернуться в «C#»