ObjectExtension.cs 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320
  1. // 大名科技(天津)有限公司 版权所有
  2. //
  3. // 此源代码遵循位于源代码树根目录中的 LICENSE 文件的许可证
  4. //
  5. // 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动
  6. //
  7. // 任何基于本项目二次开发而产生的一切法律纠纷和责任,均与作者无关
  8. namespace Admin.NET.Core;
  9. /// <summary>
  10. /// 对象拓展
  11. /// </summary>
  12. [SuppressSniffer]
  13. public static partial class ObjectExtension
  14. {
  15. /// <summary>
  16. /// 判断类型是否实现某个泛型
  17. /// </summary>
  18. /// <param name="type">类型</param>
  19. /// <param name="generic">泛型类型</param>
  20. /// <returns>bool</returns>
  21. public static bool HasImplementedRawGeneric(this Type type, Type generic)
  22. {
  23. // 检查接口类型
  24. var isTheRawGenericType = type.GetInterfaces().Any(IsTheRawGenericType);
  25. if (isTheRawGenericType) return true;
  26. // 检查类型
  27. while (type != null && type != typeof(object))
  28. {
  29. isTheRawGenericType = IsTheRawGenericType(type);
  30. if (isTheRawGenericType) return true;
  31. type = type.BaseType;
  32. }
  33. return false;
  34. // 判断逻辑
  35. bool IsTheRawGenericType(Type type) => generic == (type.IsGenericType ? type.GetGenericTypeDefinition() : type);
  36. }
  37. /// <summary>
  38. /// 将字典转化为QueryString格式
  39. /// </summary>
  40. /// <param name="dict"></param>
  41. /// <param name="urlEncode"></param>
  42. /// <returns></returns>
  43. public static string ToQueryString(this Dictionary<string, string> dict, bool urlEncode = true)
  44. {
  45. return string.Join("&", dict.Select(p => $"{(urlEncode ? p.Key?.UrlEncode() : "")}={(urlEncode ? p.Value?.UrlEncode() : "")}"));
  46. }
  47. /// <summary>
  48. /// 将字符串URL编码
  49. /// </summary>
  50. /// <param name="str"></param>
  51. /// <returns></returns>
  52. public static string UrlEncode(this string str)
  53. {
  54. return string.IsNullOrEmpty(str) ? "" : System.Web.HttpUtility.UrlEncode(str, Encoding.UTF8);
  55. }
  56. /// <summary>
  57. /// 对象序列化成Json字符串
  58. /// </summary>
  59. /// <param name="obj"></param>
  60. /// <returns></returns>
  61. public static string ToJson(this object obj)
  62. {
  63. return JSON.GetJsonSerializer().Serialize(obj);
  64. }
  65. /// <summary>
  66. /// Json字符串反序列化成对象
  67. /// </summary>
  68. /// <typeparam name="T"></typeparam>
  69. /// <param name="json"></param>
  70. /// <returns></returns>
  71. public static T ToObject<T>(this string json)
  72. {
  73. return JSON.GetJsonSerializer().Deserialize<T>(json);
  74. }
  75. /// <summary>
  76. /// 将object转换为long,若失败则返回0
  77. /// </summary>
  78. /// <param name="obj"></param>
  79. /// <returns></returns>
  80. public static long ParseToLong(this object obj)
  81. {
  82. try
  83. {
  84. return long.Parse(obj.ToString());
  85. }
  86. catch
  87. {
  88. return 0L;
  89. }
  90. }
  91. /// <summary>
  92. /// 将object转换为long,若失败则返回指定值
  93. /// </summary>
  94. /// <param name="str"></param>
  95. /// <param name="defaultValue"></param>
  96. /// <returns></returns>
  97. public static long ParseToLong(this string str, long defaultValue)
  98. {
  99. try
  100. {
  101. return long.Parse(str);
  102. }
  103. catch
  104. {
  105. return defaultValue;
  106. }
  107. }
  108. /// <summary>
  109. /// 将object转换为double,若失败则返回0
  110. /// </summary>
  111. /// <param name="obj"></param>
  112. /// <returns></returns>
  113. public static double ParseToDouble(this object obj)
  114. {
  115. try
  116. {
  117. return double.Parse(obj.ToString());
  118. }
  119. catch
  120. {
  121. return 0;
  122. }
  123. }
  124. /// <summary>
  125. /// 将object转换为double,若失败则返回指定值
  126. /// </summary>
  127. /// <param name="str"></param>
  128. /// <param name="defaultValue"></param>
  129. /// <returns></returns>
  130. public static double ParseToDouble(this object str, double defaultValue)
  131. {
  132. try
  133. {
  134. return double.Parse(str.ToString());
  135. }
  136. catch
  137. {
  138. return defaultValue;
  139. }
  140. }
  141. /// <summary>
  142. /// 将string转换为DateTime,若失败则返回日期最小值
  143. /// </summary>
  144. /// <param name="str"></param>
  145. /// <returns></returns>
  146. public static DateTime ParseToDateTime(this string str)
  147. {
  148. try
  149. {
  150. if (string.IsNullOrWhiteSpace(str))
  151. {
  152. return DateTime.MinValue;
  153. }
  154. if (str.Contains('-') || str.Contains('/'))
  155. {
  156. return DateTime.Parse(str);
  157. }
  158. else
  159. {
  160. int length = str.Length;
  161. switch (length)
  162. {
  163. case 4:
  164. return DateTime.ParseExact(str, "yyyy", System.Globalization.CultureInfo.CurrentCulture);
  165. case 6:
  166. return DateTime.ParseExact(str, "yyyyMM", System.Globalization.CultureInfo.CurrentCulture);
  167. case 8:
  168. return DateTime.ParseExact(str, "yyyyMMdd", System.Globalization.CultureInfo.CurrentCulture);
  169. case 10:
  170. return DateTime.ParseExact(str, "yyyyMMddHH", System.Globalization.CultureInfo.CurrentCulture);
  171. case 12:
  172. return DateTime.ParseExact(str, "yyyyMMddHHmm", System.Globalization.CultureInfo.CurrentCulture);
  173. case 14:
  174. return DateTime.ParseExact(str, "yyyyMMddHHmmss", System.Globalization.CultureInfo.CurrentCulture);
  175. default:
  176. return DateTime.ParseExact(str, "yyyyMMddHHmmss", System.Globalization.CultureInfo.CurrentCulture);
  177. }
  178. }
  179. }
  180. catch
  181. {
  182. return DateTime.MinValue;
  183. }
  184. }
  185. /// <summary>
  186. /// 将string转换为DateTime,若失败则返回默认值
  187. /// </summary>
  188. /// <param name="str"></param>
  189. /// <param name="defaultValue"></param>
  190. /// <returns></returns>
  191. public static DateTime ParseToDateTime(this string str, DateTime? defaultValue)
  192. {
  193. try
  194. {
  195. if (string.IsNullOrWhiteSpace(str))
  196. {
  197. return defaultValue.GetValueOrDefault();
  198. }
  199. if (str.Contains('-') || str.Contains('/'))
  200. {
  201. return DateTime.Parse(str);
  202. }
  203. else
  204. {
  205. int length = str.Length;
  206. switch (length)
  207. {
  208. case 4:
  209. return DateTime.ParseExact(str, "yyyy", System.Globalization.CultureInfo.CurrentCulture);
  210. case 6:
  211. return DateTime.ParseExact(str, "yyyyMM", System.Globalization.CultureInfo.CurrentCulture);
  212. case 8:
  213. return DateTime.ParseExact(str, "yyyyMMdd", System.Globalization.CultureInfo.CurrentCulture);
  214. case 10:
  215. return DateTime.ParseExact(str, "yyyyMMddHH", System.Globalization.CultureInfo.CurrentCulture);
  216. case 12:
  217. return DateTime.ParseExact(str, "yyyyMMddHHmm", System.Globalization.CultureInfo.CurrentCulture);
  218. case 14:
  219. return DateTime.ParseExact(str, "yyyyMMddHHmmss", System.Globalization.CultureInfo.CurrentCulture);
  220. default:
  221. return DateTime.ParseExact(str, "yyyyMMddHHmmss", System.Globalization.CultureInfo.CurrentCulture);
  222. }
  223. }
  224. }
  225. catch
  226. {
  227. return defaultValue.GetValueOrDefault();
  228. }
  229. }
  230. /// <summary>
  231. /// 是否有值
  232. /// </summary>
  233. /// <param name="obj"></param>
  234. /// <returns></returns>
  235. public static bool IsNullOrEmpty(this object obj)
  236. {
  237. return obj == null || string.IsNullOrEmpty(obj.ToString());
  238. }
  239. /// <summary>
  240. /// 字符串掩码
  241. /// </summary>
  242. /// <param name="str">字符串</param>
  243. /// <param name="mask">掩码符</param>
  244. /// <returns></returns>
  245. public static string Mask(this string str, char mask = '*')
  246. {
  247. if (string.IsNullOrWhiteSpace(str?.Trim()))
  248. return str;
  249. str = str.Trim();
  250. var masks = mask.ToString().PadLeft(4, mask);
  251. return str.Length switch
  252. {
  253. >= 11 => Regex.Replace(str, "(.{3}).*(.{4})", $"$1{masks}$2"),
  254. 10 => Regex.Replace(str, "(.{3}).*(.{3})", $"$1{masks}$2"),
  255. 9 => Regex.Replace(str, "(.{2}).*(.{3})", $"$1{masks}$2"),
  256. 8 => Regex.Replace(str, "(.{2}).*(.{2})", $"$1{masks}$2"),
  257. 7 => Regex.Replace(str, "(.{1}).*(.{2})", $"$1{masks}$2"),
  258. 6 => Regex.Replace(str, "(.{1}).*(.{1})", $"$1{masks}$2"),
  259. _ => Regex.Replace(str, "(.{1}).*", $"$1{masks}")
  260. };
  261. }
  262. /// <summary>
  263. /// 身份证号掩码
  264. /// </summary>
  265. /// <param name="idCard">身份证号</param>
  266. /// <param name="mask">掩码符</param>
  267. /// <returns></returns>
  268. public static string MaskIdCard(this string idCard, char mask = '*')
  269. {
  270. if (!idCard.TryValidate(ValidationTypes.IDCard).IsValid) return idCard;
  271. var masks = mask.ToString().PadLeft(8, mask);
  272. return Regex.Replace(idCard, @"^(.{6})(.*)(.{4})$", $"$1{masks}$3");
  273. }
  274. /// <summary>
  275. /// 邮箱掩码
  276. /// </summary>
  277. /// <param name="email">邮箱</param>
  278. /// <param name="mask">掩码符</param>
  279. /// <returns></returns>
  280. public static string MaskEmail(this string email, char mask = '*')
  281. {
  282. if (!email.TryValidate(ValidationTypes.EmailAddress).IsValid) return email;
  283. var masks = mask.ToString().PadLeft(4, mask);
  284. return email.Replace(@"^([^\.]+)\.?", $"$1{masks}$2");
  285. }
  286. }