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