// 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>
/// å°† string æ—¶é—´æ—¥æœŸæ ¼å¼è½¬æ¢æˆå—符串 如 {yyyy} => 2024
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static string ParseToDateTimeForRep(this string str)
{
if (string.IsNullOrWhiteSpace(str))
str = $"{DateTime.Now.Year}/{DateTime.Now.Month}/{DateTime.Now.Day}";
var date = DateTime.Now;
var reg = new Regex(@"(\{.+?})");
var match = reg.Matches(str);
match.ToList().ForEach(u =>
{
var temp = date.ToString(u.ToString().Substring(1, u.Length - 2));
str = str.Replace(u.ToString(), temp);
});
return str;
}
/// <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");
}
/// <summary>
/// å°†å—符串转为值类型,若没有得到或者错误返回为空
/// </summary>
/// <typeparam name="T">指定值类型</typeparam>
/// <param name="str">ä¼ å…¥å—符串</param>
/// <returns>å¯ç©ºå€¼</returns>
public static T? ParseTo<T>(this string str) where T : struct
{
try
{
if (!string.IsNullOrWhiteSpace(str))
{
MethodInfo method = typeof(T).GetMethod("Parse", new Type[] { typeof(string) });
if (method != null)
{
T result = (T)method.Invoke(null, new string[] { str });
return result;
}
}
}
catch
{
}
return null;
}
/// <summary>
/// å°†å—符串转为值类型,若没有得到或者错误返回为空
/// </summary>
/// <param name="str">ä¼ å…¥å—符串</param>
/// <param name="type">ç›®æ ‡ç±»åž‹</param>
/// <returns>å¯ç©ºå€¼</returns>
public static object ParseTo(this string str, Type type)
{
try
{
if (type.Name == "String")
return str;
if (!string.IsNullOrWhiteSpace(str))
{
var _type = type;
if (type.Name.StartsWith("Nullable"))
_type = type.GetGenericArguments()[0];
MethodInfo method = _type.GetMethod("Parse", new Type[] { typeof(string) });
if (method != null)
return method.Invoke(null, new string[] { str });
}
}
catch
{
}
return null;
}
/// <summary>
/// 将一个对象属性值赋给å¦ä¸€ä¸ªæŒ‡å®šå¯¹è±¡å±žæ€§, åªå¤åˆ¶ç›¸åŒå±žæ€§çš„
/// </summary>
/// <param name="src">原数æ®å¯¹è±¡</param>
/// <param name="target">ç›®æ ‡æ•°æ®å¯¹è±¡</param>
/// <param name="changeProperties">å±žæ€§é›†ï¼Œé”®ä¸ºåŽŸå±žæ€§ï¼Œå€¼ä¸ºç›®æ ‡å±žæ€§</param>
/// <param name="unChangeProperties">å±žæ€§é›†ï¼Œç›®æ ‡ä¸ä¿®æ”¹çš„属性</param>
public static void CopyTo(object src, object target, Dictionary<string, string> changeProperties = null, string[] unChangeProperties = null)
{
if (src == null || target == null)
throw new ArgumentException("src == null || target == null ");
var SourceType = src.GetType();
var TargetType = target.GetType();
if (changeProperties == null || changeProperties.Count == 0)
{
var fields = TargetType.GetProperties();
changeProperties = fields.Select(m => m.Name).ToDictionary(m => m);
}
if (unChangeProperties == null || unChangeProperties.Length == 0)
{
foreach (var item in changeProperties)
{
var srcProperty = SourceType.GetProperty(item.Key);
if (srcProperty != null)
{
var sourceVal = srcProperty.GetValue(src, null);
var tarProperty = TargetType.GetProperty(item.Value);
tarProperty?.SetValue(target, sourceVal, null);
}
}
}
else
{
foreach (var item in changeProperties)
{
if (!unChangeProperties.Any(m => m == item.Value))
{
var srcProperty = SourceType.GetProperty(item.Key);
if (srcProperty != null)
{
var sourceVal = srcProperty.GetValue(src, null);
var tarProperty = TargetType.GetProperty(item.Value);
tarProperty?.SetValue(target, sourceVal, null);
}
}
}
}
}
}