using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; using WIDESEA_Core.Const; using WIDESEA_Core.Enums; namespace WIDESEA_Core.Helper { public static class UtilConvert { private static DateTime dateStart = new DateTime(1970, 1, 1, 8, 0, 0); private static long longTime = 621355968000000000; private static int samllTime = 10000000; /// /// 将时间戳转换为本地日期时间 /// /// 要转换的时间戳对象 /// 转换后的本地DateTime对象 /// 如果参数为null,则返回默认起始日期 public static DateTime GetTimeSpmpToDate(this object timeStamp) { if (timeStamp == null) return dateStart; DateTime dateTime = new DateTime(longTime + Convert.ToInt64(timeStamp) * samllTime, DateTimeKind.Utc).ToLocalTime(); return dateTime; } /// /// 将对象序列化为JSON字符串 /// /// 要序列化的对象 /// 日期格式化设置,默认为"yyyy-MM-dd HH:mm:ss"格式 /// 序列化后的JSON字符串,如果对象为null则返回null public static string Serialize(this object obj, JsonSerializerSettings formatDate = null) { if (obj == null) return null; formatDate = formatDate ?? new JsonSerializerSettings { DateFormatString = "yyyy-MM-dd HH:mm:ss" }; return JsonConvert.SerializeObject(obj, formatDate); } /// /// 将JSON字符串反序列化为指定类型的对象 /// /// 目标对象类型 /// 要反序列化的JSON字符串 /// 反序列化后的对象实例,如果输入为空则返回默认值 /// /// 当输入为"{}"时会自动转换为"[]"处理 /// public static T DeserializeObject(this string json) { if (string.IsNullOrEmpty(json)) { return default(T); } if (json == "{}") { json = "[]"; } return JsonConvert.DeserializeObject(json); } /// /// 将字符串的首字母转换为小写 /// /// 要处理的字符串 /// 首字母小写的字符串,若输入为空则返回空字符串 public static string FirstLetterToLower(this string thisValue) { if (string.IsNullOrEmpty(thisValue)) return string.Empty; string result = thisValue.Substring(0, 1).ToLower() + thisValue.Substring(1, thisValue.Length - 1); return result; } /// /// 将字符串的首字母转换为大写 /// /// 要处理的字符串 /// 首字母大写的字符串,若输入为空则返回空字符串 public static string FirstLetterToUpper(this string thisValue) { if (string.IsNullOrEmpty(thisValue)) return string.Empty; string result = thisValue.Substring(0, 1).ToUpper() + thisValue.Substring(1, thisValue.Length - 1); return result; } /// /// 将对象转换为整型值 /// /// 要转换的对象 /// 转换后的整型值,转换失败返回0 /// /// 支持处理null值、DBNull.Value和枚举类型 /// public static int ObjToInt(this object thisValue) { int reval = 0; if (thisValue == null) return 0; if (thisValue is Enum && thisValue != DBNull.Value && Enum.TryParse(thisValue.GetType(), thisValue.ToString(), out var val)) { return Convert.ToInt32(val.ChangeType(typeof(int))); } if (thisValue != DBNull.Value && int.TryParse(thisValue.ToString(), out reval)) { return reval; } return reval; } /// /// 将双精度浮点数转换为32位有符号整数 /// /// 要转换的双精度浮点数 /// 转换后的32位有符号整数 public static int DoubleToInt(this double thisValue) { int reval = 0; return Convert.ToInt32(thisValue); } /// /// 将对象转换为整数,若转换失败则返回指定的错误值 /// /// 要转换的对象 /// 转换失败时返回的错误值 /// 转换后的整数值或指定的错误值 public static int ObjToInt(this object thisValue, int errorValue) { int reval = 0; if (thisValue != null && thisValue != DBNull.Value && int.TryParse(thisValue.ToString(), out reval)) { return reval; } return errorValue; } /// /// 将对象转换为长整型(long) /// /// 要转换的对象 /// 转换后的长整型值,转换失败或为null时返回0 /// /// 处理DBNull.Value情况,并尝试将对象转换为long类型 /// public static long ObjToLong(this object thisValue) { long reval = 0; if (thisValue == null) return 0; if (thisValue != DBNull.Value && long.TryParse(thisValue.ToString(), out reval)) { return reval; } return reval; } /// /// 将对象转换为金额(double类型)。若转换失败则返回0。 /// /// 待转换的对象 /// 转换后的金额值,失败返回0 public static double ObjToMoney(this object thisValue) { double reval = 0; if (thisValue != null && thisValue != DBNull.Value && double.TryParse(thisValue.ToString(), out reval)) { return reval; } return 0; } /// /// 将对象转换为金额(double)类型,转换失败时返回指定的错误值 /// /// 要转换的对象 /// 转换失败时返回的默认值 /// 转换成功的double值或指定的错误值 public static double ObjToMoney(this object thisValue, double errorValue) { double reval = 0; if (thisValue != null && thisValue != DBNull.Value && double.TryParse(thisValue.ToString(), out reval)) { return reval; } return errorValue; } /// /// 将对象转换为字符串,若对象为null则返回空字符串 /// /// 要转换的对象 /// 去除前后空格的字符串结果 public static string ObjToString(this object thisValue) { if (thisValue != null) return thisValue.ToString().Trim(); return ""; } /// /// 判断对象是否不为空或null值 /// /// 要判断的对象 /// 当对象不为空且不等于"undefined"或"null"字符串时返回true,否则返回false public static bool IsNotEmptyOrNull(this object thisValue) { return ObjToString(thisValue) != "" && ObjToString(thisValue) != "undefined" && ObjToString(thisValue) != "null"; } /// /// 将对象转换为字符串,如果对象为null则返回指定的错误值 /// /// 要转换的对象 /// 当对象为null时返回的值 /// 对象的字符串表示或指定的错误值 public static string ObjToString(this object thisValue, string errorValue) { if (thisValue != null) return thisValue.ToString().Trim(); return errorValue; } /// /// 判断对象是否为null、DBNull或空字符串 /// /// 要检查的对象 /// 如果对象为null、DBNull或空字符串则返回true,否则返回false public static bool IsNullOrEmpty(this object thisValue) => thisValue == null || thisValue == DBNull.Value || string.IsNullOrWhiteSpace(thisValue.ToString()); /// /// 将对象转换为Decimal类型 /// /// 要转换的对象 /// 转换后的Decimal值,转换失败返回0 public static Decimal ObjToDecimal(this object thisValue) { Decimal reval = 0; if (thisValue != null && thisValue != DBNull.Value && decimal.TryParse(thisValue.ToString(), out reval)) { return reval; } return 0; } /// /// 将对象转换为Decimal类型,若转换失败则返回指定的默认值 /// /// 要转换的对象 /// 转换失败时返回的默认值 /// 转换成功的Decimal值或指定的默认值 public static Decimal ObjToDecimal(this object thisValue, decimal errorValue) { Decimal reval = 0; if (thisValue != null && thisValue != DBNull.Value && decimal.TryParse(thisValue.ToString(), out reval)) { return reval; } return errorValue; } /// /// 将对象转换为DateTime类型 /// /// 要转换的对象 /// 转换后的DateTime值,转换失败返回DateTime.MinValue public static DateTime ObjToDate(this object thisValue) { DateTime reval = DateTime.MinValue; if (thisValue != null && thisValue != DBNull.Value && DateTime.TryParse(thisValue.ToString(), out reval)) { reval = Convert.ToDateTime(thisValue); } return reval; } /// /// 将对象转换为DateTime类型,转换失败时返回指定的默认值 /// /// 要转换的对象 /// 转换失败时返回的默认值 /// 转换成功的DateTime值或指定的默认值 public static DateTime ObjToDate(this object thisValue, DateTime errorValue) { DateTime reval = DateTime.MinValue; if (thisValue != null && thisValue != DBNull.Value && DateTime.TryParse(thisValue.ToString(), out reval)) { return reval; } return errorValue; } /// /// 将对象转换为布尔值 /// /// 要转换的对象 /// 转换后的布尔值,转换失败时返回false public static bool ObjToBool(this object thisValue) { bool reval = false; if (thisValue != null && thisValue != DBNull.Value && bool.TryParse(thisValue.ToString(), out reval)) { return reval; } return reval; } /// /// 将DateTime转换为Unix时间戳(秒级) /// /// 需要转换的DateTime对象 /// 返回表示Unix时间戳的字符串 public static string DateToTimeStamp(this DateTime thisValue) { TimeSpan ts = thisValue - new DateTime(1970, 1, 1, 0, 0, 0, 0); return Convert.ToInt64(ts.TotalSeconds).ToString(); } /// /// 将对象转换为指定类型 /// /// 要转换的对象 /// 目标类型 /// 转换后的对象 /// /// 支持处理null值、枚举类型、泛型类型、Guid、Version等特殊类型的转换。 /// 如果转换失败或类型不匹配,将返回原始值或抛出异常。 /// public static object ChangeType(this object value, Type type) { if (value == null && type.IsGenericType) return Activator.CreateInstance(type); if (value == null) return null; if (type == value.GetType()) return value; if (type.IsEnum) { if (value is string) return Enum.Parse(type, value as string); else return Enum.ToObject(type, value); } if (!type.IsInterface && type.IsGenericType) { Type innerType = type.GetGenericArguments()[0]; object innerValue = ChangeType(value, innerType); return Activator.CreateInstance(type, new object[] { innerValue }); } if (value is string && type == typeof(Guid)) return new Guid(value as string); if (value is string && type == typeof(Version)) return new Version(value as string); if (!(value is IConvertible)) return value; return Convert.ChangeType(value, type); } /// /// 将对象值转换为指定类型的泛型列表。 /// /// 待转换的对象值 /// 目标列表元素类型 /// 转换后的泛型列表对象,若输入为null则返回默认值 /// /// 支持处理以括号包裹的字符串格式(如"(1,2,3)"或"("a","b")"), /// 自动去除分隔符并将元素转换为目标类型后添加到列表。 /// public static object ChangeTypeList(this object value, Type type) { if (value == null) return default; var gt = typeof(List<>).MakeGenericType(type); dynamic lis = Activator.CreateInstance(gt); var addMethod = gt.GetMethod("Add"); string values = value.ToString(); if (values != null && values.StartsWith("(") && values.EndsWith(")")) { string[] splits; if (values.Contains("\",\"")) { splits = values.Remove(values.Length - 2, 2) .Remove(0, 2) .Split("\",\""); } else { splits = values.Remove(0, 1) .Remove(values.Length - 2, 1) .Split(","); } foreach (var split in splits) { var str = split; if (split.StartsWith("\"") && split.EndsWith("\"")) { str = split.Remove(0, 1) .Remove(split.Length - 2, 1); } addMethod.Invoke(lis, new object[] { ChangeType(str, type) }); } } return lis; } /// /// 将对象序列化为JSON字符串 /// /// 要序列化的对象 /// 对象的JSON字符串表示 public static string ToJson(this object value) { return JsonConvert.SerializeObject(value); } /// /// 判断对象是否可以转换为整数 /// /// 要判断的对象 /// 如果可以转换为整数返回true,否则返回false public static bool IsInt(this object obj) { if (obj == null) return false; bool reslut = Int32.TryParse(obj.ToString(), out int _number); return reslut; } /// /// 判断对象是否为有效日期格式 /// /// 待检测的对象 /// true表示是有效日期,false则不是 /// 此方法是扩展方法,通过调用IsDate(out _)实现 public static bool IsDate(this object str) { return str.IsDate(out _); } /// /// 判断对象是否可以转换为有效的日期时间 /// /// 要判断的对象 /// 输出转换后的日期时间值 /// 如果转换成功返回true,否则返回false public static bool IsDate(this object str, out DateTime dateTime) { dateTime = DateTime.Now; if (str == null || str.ToString() == "") { return false; } return DateTime.TryParse(str.ToString(), out dateTime); } /// /// 判断字符串是否可以转换为数字 /// /// 要检查的字符串 /// 格式字符串(未使用) /// 如果字符串可以转换为数字则返回true,否则返回false /// /// 使用正则表达式验证字符串是否为数字格式,支持正负号和小数点 /// public static bool IsNumber(this string str, string formatString) { if (string.IsNullOrEmpty(str)) return false; return Regex.IsMatch(str, @"^[+-]?\d*[.]?\d*$"); } /// /// 判断字符串是否为有效的Guid格式 /// /// 要验证的字符串 /// 如果字符串是有效的Guid格式则返回true,否则返回false public static bool IsGuid(this string guid) { Guid newId; return guid.GetGuid(out newId); } /// /// 将字符串转换为Guid类型 /// /// 要转换的字符串 /// 输出转换后的Guid /// 转换成功返回true,否则返回false public static bool GetGuid(this string guid, out Guid outId) { Guid emptyId = Guid.Empty; return Guid.TryParse(guid, out outId); } /// /// 将字符串类型的条件转换为对应的Linq表达式类型 /// /// 表示条件的字符串 /// 对应的Linq表达式类型枚举值 /// /// 该方法用于将前端传递的条件字符串映射为后端Linq查询使用的表达式类型, /// 支持包含、大于等于、小于等于、大于、小于、模糊匹配等常见条件类型, /// 默认返回等于(Equal)类型 /// public static LinqExpressionType GetLinqCondition(this string stringType) { LinqExpressionType linqExpression; switch (stringType) { case HtmlElementType.Contains: case HtmlElementType.selectlist: case nameof(HtmlElementType.Contains): linqExpression = LinqExpressionType.In; break; case HtmlElementType.ThanOrEqual: case nameof(HtmlElementType.ThanOrEqual): case HtmlElementType.thanorequal: linqExpression = LinqExpressionType.ThanOrEqual; break; case HtmlElementType.LessOrEqual: case nameof(HtmlElementType.LessOrEqual): case HtmlElementType.lessorequal: linqExpression = LinqExpressionType.LessThanOrEqual; break; case HtmlElementType.GT: case nameof(HtmlElementType.GT): linqExpression = LinqExpressionType.GreaterThan; break; case HtmlElementType.lt: linqExpression = LinqExpressionType.LessThan; break; case HtmlElementType.like: linqExpression = LinqExpressionType.Contains; break; default: linqExpression = LinqExpressionType.Equal; break; } return linqExpression; } } }