本文整理汇总了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);
}
}));
});
}