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
}
}