// Admin.NET 项目的版æƒã€å•†æ ‡ã€ä¸“利和其他相关æƒåˆ©å‡å—ç›¸åº”æ³•å¾‹æ³•è§„çš„ä¿æŠ¤ã€‚ä½¿ç”¨æœ¬é¡¹ç›®åº”éµå®ˆç›¸å…³æ³•律法规和许å¯è¯çš„è¦æ±‚。 // // 本项目主è¦éµå¾ª MIT 许å¯è¯å’Œ Apache 许å¯è¯ï¼ˆç‰ˆæœ¬ 2.0)进行分å‘和使用。许å¯è¯ä½äºŽæºä»£ç æ ‘æ ¹ç›®å½•ä¸çš„ LICENSE-MIT å’Œ LICENSE-APACHE 文件。 // // ä¸å¾—利用本项目从事å±å®³å›½å®¶å®‰å…¨ã€æ‰°ä¹±ç¤¾ä¼šç§©åºã€ä¾µçŠ¯ä»–äººåˆæ³•æƒç›Šç‰æ³•å¾‹æ³•è§„ç¦æ¢çš„æ´»åЍï¼ä»»ä½•基于本项目二次开å‘è€Œäº§ç”Ÿçš„ä¸€åˆ‡æ³•å¾‹çº çº·å’Œè´£ä»»ï¼Œæˆ‘ä»¬ä¸æ‰¿æ‹…ä»»ä½•è´£ä»»ï¼ namespace Admin.NET.Core; /// <summary> /// 对象拓展 /// </summary> [SuppressSniffer] public static partial class ObjectExtension { /// <summary> /// 判æ–类型是å¦å®žçްæŸä¸ªæ³›åž‹ /// </summary> /// <param name="type">类型</param> /// <param name="generic">泛型类型</param> /// <returns>bool</returns> public static bool HasImplementedRawGeneric(this Type type, Type generic) { // 检查接å£ç±»åž‹ var isTheRawGenericType = type.GetInterfaces().Any(IsTheRawGenericType); if (isTheRawGenericType) return true; // 检查类型 while (type != null && type != typeof(object)) { isTheRawGenericType = IsTheRawGenericType(type); if (isTheRawGenericType) return true; type = type.BaseType; } return false; // 判æ–逻辑 bool IsTheRawGenericType(Type type) => generic == (type.IsGenericType ? type.GetGenericTypeDefinition() : type); } /// <summary> /// å°†å—典转化为QueryStringæ ¼å¼ /// </summary> /// <param name="dict"></param> /// <param name="urlEncode"></param> /// <returns></returns> public static string ToQueryString(this Dictionary<string, string> dict, bool urlEncode = true) { return string.Join("&", dict.Select(p => $"{(urlEncode ? p.Key?.UrlEncode() : "")}={(urlEncode ? p.Value?.UrlEncode() : "")}")); } /// <summary> /// å°†å—符串URLç¼–ç /// </summary> /// <param name="str"></param> /// <returns></returns> public static string UrlEncode(this string str) { return string.IsNullOrEmpty(str) ? "" : System.Uri.EscapeDataString(str); } /// <summary> /// 对象åºåˆ—化æˆJsonå—符串 /// </summary> /// <param name="obj"></param> /// <returns></returns> public static string ToJson(this object obj) { return JSON.GetJsonSerializer().Serialize(obj); } /// <summary> /// Jsonå—符串ååºåˆ—化æˆå¯¹è±¡ /// </summary> /// <typeparam name="T"></typeparam> /// <param name="json"></param> /// <returns></returns> public static T ToObject<T>(this string json) { return JSON.GetJsonSerializer().Deserialize<T>(json); } /// <summary> /// å°†object转æ¢ä¸ºlong,若失败则返回0 /// </summary> /// <param name="obj"></param> /// <returns></returns> public static long ParseToLong(this object obj) { try { return long.Parse(obj.ToString()); } catch { return 0L; } } /// <summary> /// å°†object转æ¢ä¸ºlong,若失败则返回指定值 /// </summary> /// <param name="str"></param> /// <param name="defaultValue"></param> /// <returns></returns> public static long ParseToLong(this string str, long defaultValue) { try { return long.Parse(str); } catch { return defaultValue; } } /// <summary> /// å°†object转æ¢ä¸ºdouble,若失败则返回0 /// </summary> /// <param name="obj"></param> /// <returns></returns> public static double ParseToDouble(this object obj) { try { return double.Parse(obj.ToString()); } catch { return 0; } } /// <summary> /// å°†object转æ¢ä¸ºdouble,若失败则返回指定值 /// </summary> /// <param name="str"></param> /// <param name="defaultValue"></param> /// <returns></returns> public static double ParseToDouble(this object str, double defaultValue) { try { return double.Parse(str.ToString()); } catch { return defaultValue; } } /// <summary> /// å°†string转æ¢ä¸ºDateTime,若失败则返回日期最å°å€¼ /// </summary> /// <param name="str"></param> /// <returns></returns> public static DateTime ParseToDateTime(this string str) { try { if (string.IsNullOrWhiteSpace(str)) { return DateTime.MinValue; } if (str.Contains('-') || str.Contains('/')) { return DateTime.Parse(str); } else { int length = str.Length; switch (length) { case 4: return DateTime.ParseExact(str, "yyyy", System.Globalization.CultureInfo.CurrentCulture); case 6: return DateTime.ParseExact(str, "yyyyMM", System.Globalization.CultureInfo.CurrentCulture); case 8: return DateTime.ParseExact(str, "yyyyMMdd", System.Globalization.CultureInfo.CurrentCulture); case 10: return DateTime.ParseExact(str, "yyyyMMddHH", System.Globalization.CultureInfo.CurrentCulture); case 12: return DateTime.ParseExact(str, "yyyyMMddHHmm", System.Globalization.CultureInfo.CurrentCulture); case 14: return DateTime.ParseExact(str, "yyyyMMddHHmmss", System.Globalization.CultureInfo.CurrentCulture); default: return DateTime.ParseExact(str, "yyyyMMddHHmmss", System.Globalization.CultureInfo.CurrentCulture); } } } catch { return DateTime.MinValue; } } /// <summary> /// å°†string转æ¢ä¸ºDateTime,若失败则返回默认值 /// </summary> /// <param name="str"></param> /// <param name="defaultValue"></param> /// <returns></returns> public static DateTime ParseToDateTime(this string str, DateTime? defaultValue) { try { if (string.IsNullOrWhiteSpace(str)) { return defaultValue.GetValueOrDefault(); } if (str.Contains('-') || str.Contains('/')) { return DateTime.Parse(str); } else { int length = str.Length; switch (length) { case 4: return DateTime.ParseExact(str, "yyyy", System.Globalization.CultureInfo.CurrentCulture); case 6: return DateTime.ParseExact(str, "yyyyMM", System.Globalization.CultureInfo.CurrentCulture); case 8: return DateTime.ParseExact(str, "yyyyMMdd", System.Globalization.CultureInfo.CurrentCulture); case 10: return DateTime.ParseExact(str, "yyyyMMddHH", System.Globalization.CultureInfo.CurrentCulture); case 12: return DateTime.ParseExact(str, "yyyyMMddHHmm", System.Globalization.CultureInfo.CurrentCulture); case 14: return DateTime.ParseExact(str, "yyyyMMddHHmmss", System.Globalization.CultureInfo.CurrentCulture); default: return DateTime.ParseExact(str, "yyyyMMddHHmmss", System.Globalization.CultureInfo.CurrentCulture); } } } catch { return defaultValue.GetValueOrDefault(); } } /// <summary> /// å°† string æ—¶é—´æ—¥æœŸæ ¼å¼è½¬æ¢æˆå—符串 如 {yyyy} => 2024 /// </summary> /// <param name="str"></param> /// <returns></returns> public static string ParseToDateTimeForRep(this string str) { if (string.IsNullOrWhiteSpace(str)) str = $"{DateTime.Now.Year}/{DateTime.Now.Month}/{DateTime.Now.Day}"; var date = DateTime.Now; var reg = new Regex(@"(\{.+?})"); var match = reg.Matches(str); match.ToList().ForEach(u => { var temp = date.ToString(u.ToString().Substring(1, u.Length - 2)); str = str.Replace(u.ToString(), temp); }); return str; } /// <summary> /// æ˜¯å¦æœ‰å€¼ /// </summary> /// <param name="obj"></param> /// <returns></returns> public static bool IsNullOrEmpty(this object obj) { return obj == null || string.IsNullOrEmpty(obj.ToString()); } /// <summary> /// å—符串掩ç /// </summary> /// <param name="str">å—符串</param> /// <param name="mask">掩ç 符</param> /// <returns></returns> public static string Mask(this string str, char mask = '*') { if (string.IsNullOrWhiteSpace(str?.Trim())) return str; str = str.Trim(); var masks = mask.ToString().PadLeft(4, mask); return str.Length switch { >= 11 => Regex.Replace(str, "(.{3}).*(.{4})", $"$1{masks}$2"), 10 => Regex.Replace(str, "(.{3}).*(.{3})", $"$1{masks}$2"), 9 => Regex.Replace(str, "(.{2}).*(.{3})", $"$1{masks}$2"), 8 => Regex.Replace(str, "(.{2}).*(.{2})", $"$1{masks}$2"), 7 => Regex.Replace(str, "(.{1}).*(.{2})", $"$1{masks}$2"), 6 => Regex.Replace(str, "(.{1}).*(.{1})", $"$1{masks}$2"), _ => Regex.Replace(str, "(.{1}).*", $"$1{masks}") }; } /// <summary> /// 身份è¯å·æŽ©ç /// </summary> /// <param name="idCard">身份è¯å·</param> /// <param name="mask">掩ç 符</param> /// <returns></returns> public static string MaskIdCard(this string idCard, char mask = '*') { if (!idCard.TryValidate(ValidationTypes.IDCard).IsValid) return idCard; var masks = mask.ToString().PadLeft(8, mask); return Regex.Replace(idCard, @"^(.{6})(.*)(.{4})$", $"$1{masks}$3"); } /// <summary> /// 邮箱掩ç /// </summary> /// <param name="email">邮箱</param> /// <param name="mask">掩ç 符</param> /// <returns></returns> public static string MaskEmail(this string email, char mask = '*') { if (!email.TryValidate(ValidationTypes.EmailAddress).IsValid) return email; var masks = mask.ToString().PadLeft(4, mask); return email.Replace(@"^([^\.]+)\.?", $"$1{masks}$2"); } /// <summary> /// å°†å—符串转为值类型,若没有得到或者错误返回为空 /// </summary> /// <typeparam name="T">指定值类型</typeparam> /// <param name="str">ä¼ å…¥å—符串</param> /// <returns>å¯ç©ºå€¼</returns> public static T? ParseTo<T>(this string str) where T : struct { try { if (!string.IsNullOrWhiteSpace(str)) { MethodInfo method = typeof(T).GetMethod("Parse", new Type[] { typeof(string) }); if (method != null) { T result = (T)method.Invoke(null, new string[] { str }); return result; } } } catch { } return null; } /// <summary> /// å°†å—符串转为值类型,若没有得到或者错误返回为空 /// </summary> /// <param name="str">ä¼ å…¥å—符串</param> /// <param name="type">ç›®æ ‡ç±»åž‹</param> /// <returns>å¯ç©ºå€¼</returns> public static object ParseTo(this string str, Type type) { try { if (type.Name == "String") return str; if (!string.IsNullOrWhiteSpace(str)) { var _type = type; if (type.Name.StartsWith("Nullable")) _type = type.GetGenericArguments()[0]; MethodInfo method = _type.GetMethod("Parse", new Type[] { typeof(string) }); if (method != null) return method.Invoke(null, new string[] { str }); } } catch { } return null; } /// <summary> /// 将一个对象属性值赋给å¦ä¸€ä¸ªæŒ‡å®šå¯¹è±¡å±žæ€§, åªå¤åˆ¶ç›¸åŒå±žæ€§çš„ /// </summary> /// <param name="src">原数æ®å¯¹è±¡</param> /// <param name="target">ç›®æ ‡æ•°æ®å¯¹è±¡</param> /// <param name="changeProperties">å±žæ€§é›†ï¼Œé”®ä¸ºåŽŸå±žæ€§ï¼Œå€¼ä¸ºç›®æ ‡å±žæ€§</param> /// <param name="unChangeProperties">å±žæ€§é›†ï¼Œç›®æ ‡ä¸ä¿®æ”¹çš„属性</param> public static void CopyTo(object src, object target, Dictionary<string, string> changeProperties = null, string[] unChangeProperties = null) { if (src == null || target == null) throw new ArgumentException("src == null || target == null "); var SourceType = src.GetType(); var TargetType = target.GetType(); if (changeProperties == null || changeProperties.Count == 0) { var fields = TargetType.GetProperties(); changeProperties = fields.Select(m => m.Name).ToDictionary(m => m); } if (unChangeProperties == null || unChangeProperties.Length == 0) { foreach (var item in changeProperties) { var srcProperty = SourceType.GetProperty(item.Key); if (srcProperty != null) { var sourceVal = srcProperty.GetValue(src, null); var tarProperty = TargetType.GetProperty(item.Value); tarProperty?.SetValue(target, sourceVal, null); } } } else { foreach (var item in changeProperties) { if (!unChangeProperties.Any(m => m == item.Value)) { var srcProperty = SourceType.GetProperty(item.Key); if (srcProperty != null) { var sourceVal = srcProperty.GetValue(src, null); var tarProperty = TargetType.GetProperty(item.Value); tarProperty?.SetValue(target, sourceVal, null); } } } } } }