You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

128 lines
4.0 KiB

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