Как перехватить методы с помощью 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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