MethodInterceptor

目录

1 MethodInterceptor

1.1 SetParameters

1.2 /// Intercept the invocation

  1. MethodInterceptor
    1. SetParameters

    private void SetParameters(T decorated, IContextProvider contextProvider, IAttributeProvider attributeProvider)

    {

    _decorated = decorated;

    _contextProvider = contextProvider ?? throw new ArgumentNullException(nameof(contextProvider));

    _attributeProvider = attributeProvider ?? throw new ArgumentNullException(nameof(attributeProvider));

    }

        /// <summary>

    1.         /// Intercept the invocation

        /// </summary>

        protected override object Invoke(MethodInfo targetMethod, object[] args)

        {

        var methodParameterTypes = targetMethod.GetParameters().Select(p => p.ParameterType).ToArray();

        var classMethodInfo = _decorated != null

        ? _decorated.GetType().GetMethod(targetMethod.Name, methodParameterTypes)

: targetMethod;

var invocation = new Invocation

{

Arguments = args,

GenericArguments = targetMethod.IsGenericMethod ? targetMethod.GetGenericArguments() : new Type[0],

InvocationTarget = _decorated,

Method = targetMethod,

Proxy = this,

MethodInvocationTarget = classMethodInfo,

TargetType = _decorated != null ? _decorated.GetType() : typeof(T)

};

            var methodExecutingContext = new MethodExecutingContext

            {

                InvocationContext = _contextProvider.GetContext(),

                MethodInfo = targetMethod,

                Invocation = invocation

            };

            var attributes = GetInvocationMethodFilterAttributes(invocation, methodExecutingContext.InvocationContext);

            if (attributes.Any(a => a is NoInterceptAttribute))

            {

invocation.Proceed();

return invocation.ReturnValue;

            }

            var methodFilterAttributes = attributes.OfType<MethodFilterAttribute>().OrderBy(x => x.Order).ToList();

        var exceptionFilterAttributes = attributes.OfType<ExceptionFilterAttribute>().ToList();

            var isAsync = typeof (Task).IsAssignableFrom(invocation.Method.ReturnType);

            if (isAsync)

            {

                if (invocation.Method.ReturnType.IsGenericType && invocation.Method.ReturnType.GetGenericTypeDefinition() == typeof (Task<>))

                {

                    var taskResultType = invocation.Method.ReturnType.GetGenericArguments()[0];

                    var mInfo = HandleAsyncWithTypeMethod.MakeGenericMethod(taskResultType);

if (_decorated != null)

{

                methodFilterAttributes.Add(new InvocationAttribute(invocation, taskResultType));

}

                    invocation.ReturnValue = mInfo.Invoke(this, new object[] { methodFilterAttributes, exceptionFilterAttributes, methodExecutingContext });

                }

                else

                {

                if (_decorated != null)

                {

methodFilterAttributes.Add(new InvocationAttribute(invocation));

}

                    invocation.ReturnValue = HandleAsync(methodFilterAttributes, exceptionFilterAttributes, methodExecutingContext);

                }

            }

            else

            {

            if (_decorated != null)

            {

methodFilterAttributes.Add(new InvocationAttribute(invocation));

}

                HandleSync(methodFilterAttributes, exceptionFilterAttributes, methodExecutingContext);

            }

return invocation.ReturnValue;

        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

m0_74456535

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值