using System.Collections.Concurrent; using System.Globalization; using Newtonsoft.Json; using Newtonsoft.Json.Linq; namespace BrilliantSightClient.Model.Extension; public static class CommonExtension { /// /// 安全的ToString /// /// /// public static string ToSafeString(this object obj) { if (null == obj) { return ""; } else { return obj.ToString(); } } // 缓存类型是否重写ToString的检查结果(提升性能) private static readonly ConcurrentDictionary _toStringOverriddenCache = new(); /// /// 增强版安全ToString(自动处理未重写ToString的情况) /// public static string ToSafeAbundantString(this object obj) { if (obj == null) return ""; var type = obj.GetType(); // 判断是否重写了ToString方法 var hasCustomToString = _toStringOverriddenCache.GetOrAdd(type, t => { var toStringMethod = t.GetMethod("ToString", Type.EmptyTypes); return toStringMethod?.DeclaringType != typeof(object); }); try { string result = hasCustomToString ? obj.ToString() // 使用自定义的ToString : JsonConvert.SerializeObject(obj); return result; } catch (Exception e) { return obj.ToString(); } } /// /// 生成对象签名(Null对象为时间戳) /// /// /// public static string GenerateSign(this object obj) { if (null == obj) { return Helper.Common.GenerateMd5Hash(DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss.fff")); } else { var str = $"{DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss.fff")}-{obj.GetHashCode()}-{Helper.Common.AesKey}"; return Helper.Common.GenerateMd5Hash(str); } } // public static string ConvertNumberToString(this ob value) // { // return ""; // } }