v10.10.2024.0701 使用IJsonHost改进Json序列化
大石头 编写于 2024-07-01 08:36:34 大石头 提交于 2024-07-01 08:48:33
X
namespace System.Threading.Tasks;

internal abstract class TaskActionInvoker
{
	private sealed class EmptyTaskActionInvoker : TaskActionInvoker
	{
		public override Delegate Action => null;

		public override void Invoke(Task owner, object state, Task context)
		{
		}
	}

	private sealed class ActionInvoke : TaskActionInvoker
	{
		private readonly Action action;

		public override Delegate Action => action;

		public ActionInvoke(Action action)
		{
			this.action = action;
		}

		public override void Invoke(Task owner, object state, Task context)
		{
			action();
		}
	}

	private sealed class ActionObjectInvoke : TaskActionInvoker
	{
		private readonly Action<object> action;

		public override Delegate Action => action;

		public ActionObjectInvoke(Action<object> action)
		{
			this.action = action;
		}

		public override void Invoke(Task owner, object state, Task context)
		{
			action(state);
		}
	}

	private sealed class ActionTaskInvoke : TaskActionInvoker
	{
		private readonly Action<Task> action;

		public override Delegate Action => action;

		public ActionTaskInvoke(Action<Task> action)
		{
			this.action = action;
		}

		public override void Invoke(Task owner, object state, Task context)
		{
			action(owner);
		}
	}

	private sealed class ActionTasksInvoke : TaskActionInvoker
	{
		private readonly Action<Task[]> action;

		private readonly Task[] tasks;

		public override Delegate Action => action;

		public ActionTasksInvoke(Action<Task[]> action, Task[] tasks)
		{
			this.action = action;
			this.tasks = tasks;
		}

		public override void Invoke(Task owner, object state, Task context)
		{
			action(tasks);
		}
	}

	private sealed class ActionTaskObjectInvoke : TaskActionInvoker
	{
		private readonly Action<Task, object> action;

		public override Delegate Action => action;

		public ActionTaskObjectInvoke(Action<Task, object> action)
		{
			this.action = action;
		}

		public override void Invoke(Task owner, object state, Task context)
		{
			action(owner, state);
		}
	}

	private sealed class ActionTaskObjectInvoke<TResult> : TaskActionInvoker
	{
		private readonly Action<Task<TResult>, object> action;

		public override Delegate Action => action;

		public ActionTaskObjectInvoke(Action<Task<TResult>, object> action)
		{
			this.action = action;
		}

		public override void Invoke(Task owner, object state, Task context)
		{
			action((Task<TResult>)owner, state);
		}
	}

	private sealed class ActionTaskInvoke<TResult> : TaskActionInvoker
	{
		private readonly Action<Task<TResult>> action;

		public override Delegate Action => action;

		public ActionTaskInvoke(Action<Task<TResult>> action)
		{
			this.action = action;
		}

		public override void Invoke(Task owner, object state, Task context)
		{
			action((Task<TResult>)owner);
		}
	}

	private sealed class ActionTaskSelected : TaskActionInvoker
	{
		private readonly Action<Task> action;

		private readonly Task[] tasks;

		public override Delegate Action => action;

		public ActionTaskSelected(Action<Task> action, Task[] tasks)
		{
			this.action = action;
			this.tasks = tasks;
		}

		public override void Invoke(Task owner, object state, Task context)
		{
			int result = ((Task<int>)owner).Result;
			action(tasks[result]);
		}
	}

	private sealed class FuncInvoke<TResult> : TaskActionInvoker
	{
		private readonly Func<TResult> action;

		public override Delegate Action => action;

		public FuncInvoke(Func<TResult> action)
		{
			this.action = action;
		}

		public override void Invoke(Task owner, object state, Task context)
		{
			((Task<TResult>)context).Result = action();
		}
	}

	private sealed class FuncTaskInvoke<TResult> : TaskActionInvoker
	{
		private readonly Func<Task, TResult> action;

		public override Delegate Action => action;

		public FuncTaskInvoke(Func<Task, TResult> action)
		{
			this.action = action;
		}

		public override void Invoke(Task owner, object state, Task context)
		{
			((Task<TResult>)context).Result = action(owner);
		}
	}

	private sealed class FuncTasksInvoke<TResult> : TaskActionInvoker
	{
		private readonly Func<Task[], TResult> action;

		private readonly Task[] tasks;

		public override Delegate Action => action;

		public FuncTasksInvoke(Func<Task[], TResult> action, Task[] tasks)
		{
			this.action = action;
			this.tasks = tasks;
		}

		public override void Invoke(Task owner, object state, Task context)
		{
			((Task<TResult>)context).Result = action(tasks);
		}
	}

	private sealed class FuncTaskSelected<TResult> : TaskActionInvoker
	{
		private readonly Func<Task, TResult> action;

		private readonly Task[] tasks;

		public override Delegate Action => action;

		public FuncTaskSelected(Func<Task, TResult> action, Task[] tasks)
		{
			this.action = action;
			this.tasks = tasks;
		}

		public override void Invoke(Task owner, object state, Task context)
		{
			int result = ((Task<int>)owner).Result;
			((Task<TResult>)context).Result = action(tasks[result]);
		}
	}

	private sealed class FuncTaskInvoke<TResult, TNewResult> : TaskActionInvoker
	{
		private readonly Func<Task<TResult>, TNewResult> action;

		public override Delegate Action => action;

		public FuncTaskInvoke(Func<Task<TResult>, TNewResult> action)
		{
			this.action = action;
		}

		public override void Invoke(Task owner, object state, Task context)
		{
			((Task<TNewResult>)context).Result = action((Task<TResult>)owner);
		}
	}

	private sealed class FuncObjectInvoke<TResult> : TaskActionInvoker
	{
		private readonly Func<object, TResult> action;

		public override Delegate Action => action;

		public FuncObjectInvoke(Func<object, TResult> action)
		{
			this.action = action;
		}

		public override void Invoke(Task owner, object state, Task context)
		{
			((Task<TResult>)context).Result = action(state);
		}
	}

	private sealed class FuncTaskObjectInvoke<TResult> : TaskActionInvoker
	{
		private readonly Func<Task, object, TResult> action;

		public override Delegate Action => action;

		public FuncTaskObjectInvoke(Func<Task, object, TResult> action)
		{
			this.action = action;
		}

		public override void Invoke(Task owner, object state, Task context)
		{
			((Task<TResult>)context).Result = action(owner, state);
		}
	}

	private sealed class FuncTaskObjectInvoke<TResult, TNewResult> : TaskActionInvoker
	{
		private readonly Func<Task<TResult>, object, TNewResult> action;

		public override Delegate Action => action;

		public FuncTaskObjectInvoke(Func<Task<TResult>, object, TNewResult> action)
		{
			this.action = action;
		}

		public override void Invoke(Task owner, object state, Task context)
		{
			((Task<TNewResult>)context).Result = action((Task<TResult>)owner, state);
		}
	}

	public static readonly TaskActionInvoker Empty = new EmptyTaskActionInvoker();

	public abstract Delegate Action { get; }

	public static TaskActionInvoker Create(Action action)
	{
		return new ActionInvoke(action);
	}

	public static TaskActionInvoker Create(Action<object> action)
	{
		return new ActionObjectInvoke(action);
	}

	public static TaskActionInvoker Create(Action<Task> action)
	{
		return new ActionTaskInvoke(action);
	}

	public static TaskActionInvoker Create(Action<Task, object> action)
	{
		return new ActionTaskObjectInvoke(action);
	}

	public static TaskActionInvoker Create<TResult>(Action<Task<TResult>> action)
	{
		return new ActionTaskInvoke<TResult>(action);
	}

	public static TaskActionInvoker Create<TResult>(Action<Task<TResult>, object> action)
	{
		return new ActionTaskObjectInvoke<TResult>(action);
	}

	public static TaskActionInvoker Create<TResult>(Func<TResult> action)
	{
		return new FuncInvoke<TResult>(action);
	}

	public static TaskActionInvoker Create<TResult>(Func<object, TResult> action)
	{
		return new FuncObjectInvoke<TResult>(action);
	}

	public static TaskActionInvoker Create<TResult>(Func<Task, TResult> action)
	{
		return new FuncTaskInvoke<TResult>(action);
	}

	public static TaskActionInvoker Create<TResult>(Func<Task, object, TResult> action)
	{
		return new FuncTaskObjectInvoke<TResult>(action);
	}

	public static TaskActionInvoker Create<TResult, TNewResult>(Func<Task<TResult>, TNewResult> action)
	{
		return new FuncTaskInvoke<TResult, TNewResult>(action);
	}

	public static TaskActionInvoker Create<TResult, TNewResult>(Func<Task<TResult>, object, TNewResult> action)
	{
		return new FuncTaskObjectInvoke<TResult, TNewResult>(action);
	}

	public static TaskActionInvoker Create(Action<Task[]> action, Task[] tasks)
	{
		return new ActionTasksInvoke(action, tasks);
	}

	public static TaskActionInvoker Create<TResult>(Func<Task[], TResult> action, Task[] tasks)
	{
		return new FuncTasksInvoke<TResult>(action, tasks);
	}

	public static TaskActionInvoker Create(Action<Task> action, Task[] tasks)
	{
		return new ActionTaskSelected(action, tasks);
	}

	public static TaskActionInvoker Create<TResult>(Func<Task, TResult> action, Task[] tasks)
	{
		return new FuncTaskSelected<TResult>(action, tasks);
	}

	public abstract void Invoke(Task owner, object state, Task context);
}