318 lines
10 KiB
C#
318 lines
10 KiB
C#
// 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>
|
||
/// 是否有值
|
||
/// </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");
|
||
}
|
||
} |