You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

87 lines
2.2 KiB

using System.Collections.Concurrent;
using System.Globalization;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace BrilliantSightClient.Model.Extension;
public static class CommonExtension
{
/// <summary>
/// 安全的ToString
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public static string ToSafeString(this object obj)
{
if (null == obj)
{
return "";
}
else
{
return obj.ToString();
}
}
// 缓存类型是否重写ToString的检查结果(提升性能)
private static readonly ConcurrentDictionary<Type, bool> _toStringOverriddenCache = new();
/// <summary>
/// 增强版安全ToString(自动处理未重写ToString的情况)
/// </summary>
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();
}
}
/// <summary>
/// 生成对象签名(Null对象为时间戳)
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
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 "";
// }
}