namespace MyOffice.Core; public enum GeneralExecStatus { success, failure, not_found } public class Exec : Exec where TResult : class { public Exec(TResult result, GeneralExecStatus status) : base(result, status) { } public Exec(GeneralExecStatus status) : base(status) { } public Exec() : base(GeneralExecStatus.success) { } public new Exec Set(GeneralExecStatus status) { Status = status; return this; } public new Exec Set(TResult? result) { Result = result; Status = result == null ? GeneralExecStatus.failure : GeneralExecStatus.success; return this; } } public class Exec where TResult : class where TStatus : Enum { public static Exec Start(TResult result, TStatus status) { return new Exec(result, status); } public static Exec Start(TStatus status) { return new Exec(status); } public static Exec StartSuccess() { return new Exec(GeneralExecStatus.success); } public static Exec StartFailure() { return new Exec(GeneralExecStatus.failure); } public static Exec StartNotFound() { return new Exec(GeneralExecStatus.not_found); } public Exec(TResult result, TStatus status) { Result = result; Status = status; } public Exec(TStatus status) { Status = status; } public TResult? Result { get; internal set; } public TStatus Status { get; internal set; } public Exec Set(TResult result, TStatus status) { Result = result; Status = status; return this; } public Exec Set(TStatus status) { Status = status; return this; } public Exec Set(TResult result) { Result = result; return this; } }