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;
}
}
}