当前位置: 首页>>代码示例>>C#>>正文


C# IInterceptor.GetParameterInterceptors方法代码示例

本文整理汇总了C#中IInterceptor.GetParameterInterceptors方法的典型用法代码示例。如果您正苦于以下问题:C# IInterceptor.GetParameterInterceptors方法的具体用法?C# IInterceptor.GetParameterInterceptors怎么用?C# IInterceptor.GetParameterInterceptors使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在IInterceptor的用法示例。


在下文中一共展示了IInterceptor.GetParameterInterceptors方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。

示例1: ParameterIntercept

 private static void ParameterIntercept(ILGenerator ilGenerator, IInterceptor[] interceptors,
     LocalBuilder[] local, MethodInfo method)
 {
     var parameterInterceptors = interceptors.GetParameterInterceptors();
     if (!parameterInterceptors.Any()) return;
     var invocationType = InternalDynamicTypeProvider.CreateType<IParameterInvocation>();
     var parameterType = InternalDynamicTypeProvider.CreateType<IParameter>();
     var setInterceptedMethod = invocationType.GetMethod("set_InterceptedMethod");
     var setInterceptedType = invocationType.GetMethod("set_InterceptedType");
     var setInterceptedInstance = invocationType.GetMethod("set_InterceptedInstance");
     var setParameters = invocationType.GetMethod("set_Parameters");
     var setValue = parameterType.GetMethod("set_Value");
     var getValue = parameterType.GetMethod("get_Value");
     var setName = parameterType.GetMethod("set_Name");
     var setParameterInfo = parameterType.GetMethod("set_ParameterInfo");
     var getName = typeof(ParameterInfo).GetMethod("get_Name");
     var getParameterInterceptors = typeof(InterceptorExtends).GetMethod("GetParameterInterceptors");
     var getCurrentParameter = typeof(InterceptorExtends).GetMethod("GetCurrentParameter");
     var onIntercept = typeof(IParameterInterceptor).GetMethod("OnParameterExecuting");
     var interceptorLocal = ilGenerator.DeclareLocal(typeof(IParameterInterceptor[]));
     var parametersLocal = ilGenerator.DeclareLocal(typeof(IParameter[]));
     ilGenerator.LoadLocal(local[0]).Call(getParameterInterceptors).StoreLocal(interceptorLocal);
     var invocationLocal = ilGenerator.DeclareLocal(invocationType);
     ilGenerator.New(invocationType.GetConstructor(Type.EmptyTypes)).StoreLocal(invocationLocal);
     ilGenerator.LoadLocal(invocationLocal).LoadLocal(local[1]).Callvirt(setInterceptedMethod);
     ilGenerator.LoadLocal(invocationLocal).LoadLocal(local[2]).Callvirt(setInterceptedType);
     ilGenerator.LoadLocal(invocationLocal).This().Callvirt(setInterceptedInstance);
     ilGenerator.ForEach(parameterInterceptors, (_, interceptor, i) =>
     {
         var parameters = method.GetParameters().Where(p => p.GetCustomAttributes(false).Any(c => c.GetType() == interceptor.GetType())).ToArray();
         ilGenerator.NewArray(typeof(IParameter), parameters.Length).StoreLocal(parametersLocal);
         ilGenerator.ForEach(parameters, (__, parameter, j) =>
         ilGenerator.ForEach(method.GetParameters(), (___, arg, k) =>
         {
             if (arg == parameter)
             {
                 var argLocal = ilGenerator.DeclareLocal(parameterType);
                 ilGenerator.New(parameterType.GetConstructor(Type.EmptyTypes)).StoreLocal(argLocal);
                 ilGenerator.LoadLocal(argLocal).LoadArgument(k + 1).Box(arg.ParameterType).Callvirt(setValue);
                 ilGenerator.LoadLocal(argLocal).LoadLocal(local[1]).LoadInt(k).Call(getCurrentParameter).Callvirt(setParameterInfo);
                 ilGenerator.LoadLocal(argLocal).LoadLocal(local[1]).LoadInt(k).Call(getCurrentParameter).Callvirt(getName).Callvirt(setName);
                 ilGenerator.LoadLocal(parametersLocal).LoadInt(j).LoadLocal(argLocal).SetArrayItemRef();
             }
         }));
         ilGenerator.LoadLocal(invocationLocal).LoadLocal(parametersLocal).Callvirt(setParameters);
         ilGenerator.LoadLocal(interceptorLocal).LoadArrayItem(i).LoadLocal(invocationLocal).Callvirt(onIntercept);
         ilGenerator.ForEach(parameters, (__, parameter, j) =>
         ilGenerator.ForEach(method.GetParameters(), (___, arg, k) =>
         {
             if (arg == parameter)
             {
                 ilGenerator.LoadLocal(parametersLocal).LoadArrayItem(j).Callvirt(getValue).UnBox(arg.ParameterType).StroeArgument(k + 1);
             }
         }));
     });
 }
开发者ID:FarseerNet,项目名称:Farseer.Net.DI,代码行数:56,代码来源:DynamicHelper.cs


注:本文中的IInterceptor.GetParameterInterceptors方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。