ObjectExtension.cs 10 KB

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