using System;
/// 装箱类。
public sealed class Class : IComparable, IComparable, IComparable>
{
private bool _hashcode = false;
private bool _equals = false;
/// 装箱对象。
public T Value { get; set; }
///
public bool IsNull { get { return Value == null; } }
///
public bool HasValue { get { return Value != null; } }
/// 创建默认值。
public Class(T value = default, bool tryEquals = true, bool tryHashCode = true)
{
Value = value;
_hashcode = tryHashCode;
_equals = tryEquals;
}
#region Override
///
public override int GetHashCode()
{
if (_hashcode && Value != null)
{
return Value.GetHashCode();
}
return base.GetHashCode();
}
///
public override bool Equals(object obj)
{
if (_equals)
{
var right = obj as Class;
if (right == null) return false;
if (Value == null && right.Value == null) return true;
if (Value == null && right.Value != null) return false;
if (Value != null && right.Value == null) return false;
return Value.Equals(right.Value);
}
return base.Equals(obj);
}
///
public override string ToString()
{
if (Value == null) return "";
return Value.ToString();
}
#endregion
#region IComparable
///
///
///
public int CompareTo(object obj)
{
if (obj != null && obj is T) return CompareTo((T)obj);
if (obj != null && obj is Class) return CompareTo(obj as Class);
if (Value == null) throw new MissingMemberException(typeof(T).FullName, nameof(Value));
if (!(Value is IComparable)) throw new NotSupportedException();
return ((IComparable)Value).CompareTo(obj);
}
///
///
///
public int CompareTo(T other)
{
if (Value == null) throw new MissingMemberException(typeof(T).FullName, nameof(Value));
if (!(Value is IComparable)) throw new NotSupportedException();
return ((IComparable)Value).CompareTo(other);
}
///
///
///
public int CompareTo(Class other)
{
if (Value == null) throw new MissingMemberException(typeof(T).FullName, nameof(Value));
if (other == null || !other.HasValue) return 1;
if (Value is IComparable) return ((IComparable)Value).CompareTo(other.Value);
if (Value is IComparable) return ((IComparable)Value).CompareTo(other.Value);
throw new NotSupportedException();
}
#endregion
#region 运算符。
/// 从 Class<T> 到 Boolean 的隐式转换,判断 Class<T> 包含值。
/// 当 T 是 Boolean 时,获取 Value。
当 T 是 String 时,判断 Value 不为 NULL 且不为空。
public static implicit operator bool(Class instance)
{
if (instance == null) return false;
var boolean = instance as Class;
if (boolean != null) return boolean.Value;
var text = instance as Class;
if (text != null) return !string.IsNullOrEmpty(text.Value);
return instance.HasValue;
}
// /// 从 Class<T> 到 T 的隐式转换。
// public static implicit operator T(Class instance) => instance == null ? default : instance.Value;
// /// 从 T 到 Class<T> 的隐式转换。
// public static implicit operator Class(T value) => new Class(value);
#endregion
}