1
1

NullObject.cs 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. using System;
  2. using System.Collections.Generic;
  3. namespace Masuit.Tools.Systems;
  4. /// <summary>
  5. /// 可空对象
  6. /// </summary>
  7. /// <typeparam name="T"></typeparam>
  8. public readonly record struct NullObject<T> : IComparable, IComparable<T>, IEquatable<NullObject<T>>
  9. {
  10. public NullObject()
  11. {
  12. }
  13. public NullObject(T item)
  14. {
  15. Item = item;
  16. }
  17. public static NullObject<T> Null => new();
  18. public T Item { get; }
  19. /// <summary>
  20. /// 是否是null
  21. /// </summary>
  22. /// <returns></returns>
  23. public bool IsNull => Item.IsDefaultValue();
  24. /// <summary>
  25. /// 隐式转换
  26. /// </summary>
  27. /// <param name="nullObject"></param>
  28. public static implicit operator T(NullObject<T> nullObject)
  29. {
  30. return nullObject.Item;
  31. }
  32. /// <summary>
  33. /// 隐式转换
  34. /// </summary>
  35. /// <param name="item"></param>
  36. public static implicit operator NullObject<T>(T item)
  37. {
  38. return new NullObject<T>(item);
  39. }
  40. public override string ToString()
  41. {
  42. return (Item != null) ? Item.ToString() : "NULL";
  43. }
  44. public int CompareTo(object value)
  45. {
  46. if (value is NullObject<T> nullObject)
  47. {
  48. if (nullObject.Item is IComparable c)
  49. {
  50. return ((IComparable)Item).CompareTo(c);
  51. }
  52. return Item.ToString().CompareTo(nullObject.Item.ToString());
  53. }
  54. return 1;
  55. }
  56. public int CompareTo(T other)
  57. {
  58. if (other is IComparable c)
  59. {
  60. return ((IComparable)Item).CompareTo(c);
  61. }
  62. return Item.ToString().CompareTo(other.ToString());
  63. }
  64. public override int GetHashCode()
  65. {
  66. return EqualityComparer<T>.Default.GetHashCode(Item);
  67. }
  68. /// <summary>指示当前对象是否等于同一类型的另一个对象。</summary>
  69. /// <param name="other">一个与此对象进行比较的对象。</param>
  70. /// <returns>如果当前对象等于 <paramref name="other" /> 参数,则为 true;否则为 false。</returns>
  71. public bool Equals(NullObject<T> other)
  72. {
  73. return EqualityComparer<T>.Default.Equals(Item, other.Item);
  74. }
  75. }