using Apewer.Internals; using System; using System.Collections.Generic; using System.Text; namespace Apewer { /// 结果状态,Code 为零时表示正常,Code 0 与 NULL 相等。 [Serializable] public class Result { private int _code; private string _message; /// 代码。 public int Code { get => _code; protected set => _code = value; } /// 消息。 public string Message { get => _message; protected set => _message = value; } /// 创建实例:Code = 0,Message = NULL。 public Result() { } /// 创建实例。 public Result(int code, string message = null) { _code = code; _message = message; } /// 创建实例:Code = 0。 public Result(string message, int code = 0) { _code = code; _message = message; } /// public override string ToString() { if (string.IsNullOrEmpty(_message)) return Code.ToString(); if (Code == 0) return _message; return Code.ToString() + "|" + _message; } #region 运算符。 /// 获取 Code。 public static implicit operator int(Result result) => result == null ? 0 : result._code; /// ToString public static implicit operator string(Result result) => result == null ? null : result.ToString(); #endregion } /// 装箱返回结果,T 不适用于 System.String。 [Serializable] public class Result : Result, IDisposable { private T _value; private bool _has = false; /// 对象。 public T Value { get => _value; set => Set(value); } /// 含有实体对象。 public bool HasValue { get => _has; } /// 执行与释放或重置非托管资源关联的应用程序定义的任务。 public void Dispose() => RuntimeUtility.Dispose(Value); /// 创建实例:Code = 0,Message = NULL,Value = Default。 public Result() { } /// 创建实例:Code = 0,Message = NULL。 public Result(T value) => Set(value); /// 创建实例:Value = Default。 public Result(string message, int code = 0) : base(message, code) { } /// 创建实例:Value = Default。 public Result(int code, string message = null) : base(code, message) { } /// 创建实例:Value = Default。 public Result(Exception exception, int code = 0) : base(RuntimeUtility.Message(exception), code) { } /// 创建实例:Value = Default。 public Result(int code, Exception exception = null) : base(code, RuntimeUtility.Message(exception)) { } private void Set(T value) { _value = value; _has = typeof(T).IsValueType ? true : (value != null); } #region 运算符。 /// 含有实体对象。 public static implicit operator bool(Result result) => result == null ? false : result._has; #endregion #region 扩展方法。 internal static Result As(Result source) where TDst : TSrc { if (source == null) return null; var destination = new Result(); destination.Code = source.Code; destination.Message = source.Message; if (source._has) { var maybe = source._value is TDst; try { destination.Set((TDst)source._value); } catch { } } return destination; } #endregion } }