public delegate void Action<in T1, in T2, in T3, in T4, in T5, in T6, in T7, in T8, in T9, in T10, in T11, in T12, in T13, in T14, in T15, in T16, in T17>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15, T16 arg16, T17 arg17);
public delegate TResult Func<in T1, in T2, in T3, in T4, in T5, in T6, in T7, in T8, in T9, in T10, in T11, in T12, in T13, in T14, in T15, in T16, in T17, out TResult>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15, T16 arg16, T17 arg17);
复制代码
五、委托的嵌套使用,ASP.NET CORE中心件的核心设计----委托的多层嵌套
这里创建一个很底子的一个类
public class DelegateExtension
{
public static void Show()
{
InvokeAction invokeAction = new InvokeAction();
{
}
}
}
public class InvokeAction {
public void ExeMethod()
{
Console.WriteLine("Exec ExeMethod");
}
}
复制代码
问题:想要去在Invoke.Show方法前后,扩展一些业务逻辑.
这里根据我们之前上面拓展出来的知识可以写出来这样的代码
public static void Show()
{
InvokeAction invokeAction = new InvokeAction();
{
Action action = new Action(invokeAction.ExeMethod);
//再次定义委托
{
Func<Action, Action> action2 = new Func<Action, Action>(ExeNextMethod006);
Action action3 = action2.Invoke(action);
action = action3;
Func<Action, Action> action4 = new Func<Action, Action>(ExeNextMethod005);
Action action5 = action4.Invoke(action);
action = action5;
Func<Action, Action> action6 = new Func<Action, Action>(ExeNextMethod004);
Action action7 = action6.Invoke(action);
action = action7;
Func<Action, Action> action8 = new Func<Action, Action>(ExeNextMethod003);
Action action9 = action8.Invoke(action);
action = action9;
Func<Action, Action> action10 = new Func<Action, Action>(ExeNextMethod002);
Action action11 = action10.Invoke(action);
action = action11;
Func<Action, Action> action12 = new Func<Action, Action>(ExeNextMethod001);
Action action13 = action12.Invoke(action);
action = action13;
action.Invoke();
}
}
}
public static Action ExeNextMethod001(Action action)
{
return new Action(() =>
{
Console.WriteLine("Exec ExeNextMethod001 Start");
action();
Console.WriteLine("Exec ExeNextMethod001 End");
});
}
public static Action ExeNextMethod002(Action action)
{
return new Action(() =>
{
Console.WriteLine("Exec ExeNextMethod002 Start");
action();
Console.WriteLine("Exec ExeNextMethod002 End");
});
}
public static Action ExeNextMethod003(Action action)
{
return new Action(() =>
{
Console.WriteLine("Exec ExeNextMethod003 Start");
action();
Console.WriteLine("Exec ExeNextMethod003 End");
});
}
public static Action ExeNextMethod004(Action action)
{
return new Action(() =>
{
Console.WriteLine("Exec ExeNextMethod004 Start");
action();
Console.WriteLine("Exec ExeNextMethod004 End");
});
}
public static Action ExeNextMethod005(Action action)
{
return new Action(() =>
{
Console.WriteLine("Exec ExeNextMethod005 Start");
action();
Console.WriteLine("Exec ExeNextMethod005 End");
});
}
public static Action ExeNextMethod006(Action action)