601 lines
18 KiB
C#
Raw Permalink Normal View History

2025-04-21 14:10:27 +08:00
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MyCode.Project.Infrastructure.Extensions;
namespace MyCode.Project.Infrastructure.Common
{
public static class Conv
{
#region ToByte(byte)
/// <summary>
/// 转换为8位可空整型
/// </summary>
/// <param name="input">输入值</param>
/// <returns></returns>
public static byte ToByte(object input)
{
return ToByte(input, default(byte));
}
/// <summary>
/// 转换为8位可空整型
/// </summary>
/// <param name="input">输入值</param>
/// <param name="defaultValue">默认值</param>
/// <returns></returns>
public static byte ToByte(object input, byte defaultValue)
{
return ToByteOrNull(input) ?? defaultValue;
}
/// <summary>
/// 转换为8位可空整型
/// </summary>
/// <param name="input">输入值</param>
/// <returns></returns>
public static byte? ToByteOrNull(object input)
{
byte result;
var success = byte.TryParse(input.SafeString(), out result);
if (success)
{
return result;
}
return null;
}
#endregion
#region ToChar(char)
/// <summary>
/// 转换为字符
/// </summary>
/// <param name="input">输入值</param>
/// <returns></returns>
public static char ToChar(object input)
{
return ToChar(input, default(char));
}
/// <summary>
/// 转换为字符
/// </summary>
/// <param name="input">输入值</param>
/// <param name="defaultValue">默认值</param>
/// <returns></returns>
public static char ToChar(object input, char defaultValue)
{
return ToCharOrNull(input) ?? defaultValue;
}
/// <summary>
/// 转换为可空字符
/// </summary>
/// <param name="input">输入值</param>
/// <returns></returns>
public static char? ToCharOrNull(object input)
{
char result;
var success = char.TryParse(input.SafeString(), out result);
if (success)
{
return result;
}
return null;
}
#endregion
#region ToShort(short)
/// <summary>
/// 转换为16位整型
/// </summary>
/// <param name="input">输入值</param>
/// <returns></returns>
public static short ToShort(object input)
{
return ToShort(input, default(short));
}
/// <summary>
/// 转换为16位整型
/// </summary>
/// <param name="input">输入值</param>
/// <param name="defaultValue">默认值</param>
/// <returns></returns>
public static short ToShort(object input, short defaultValue)
{
return ToShortOrNull(input) ?? defaultValue;
}
/// <summary>
/// 转换为16位可空整型
/// </summary>
/// <param name="input">输入值</param>
/// <returns></returns>
public static short? ToShortOrNull(object input)
{
short result;
var success = short.TryParse(input.SafeString(), out result);
if (success)
{
return result;
}
return null;
}
#endregion
#region ToInt(int)
/// <summary>
/// 转换为32位整型
/// </summary>
/// <param name="input">输入值</param>
/// <returns></returns>
public static int ToInt(object input)
{
return ToInt(input, default(int));
}
/// <summary>
/// 转换为32位整型
/// </summary>
/// <param name="input">输入值</param>
/// <param name="defaultValue">默认值</param>
/// <returns></returns>
public static int ToInt(object input, int defaultValue)
{
return ToIntOrNull(input) ?? defaultValue;
}
/// <summary>
/// 转换为32位可空整型
/// </summary>
/// <param name="input">输入值</param>
/// <returns></returns>
public static int? ToIntOrNull(object input)
{
int result;
var success = int.TryParse(input.SafeString(), out result);
if (success)
{
return result;
}
try
{
var temp = ToDoubleOrNull(input, 0);
if (temp == null)
{
return null;
}
return System.Convert.ToInt32(temp);
}
catch
{
return null;
}
}
#endregion
#region ToLong(long)
/// <summary>
/// 转换为64位整型
/// </summary>
/// <param name="input">输入值</param>
/// <returns></returns>
public static long ToLong(object input)
{
return ToLong(input, default(long));
}
/// <summary>
/// 转换为64位整型
/// </summary>
/// <param name="input">输入值</param>
/// <param name="defaultValue">默认值</param>
/// <returns></returns>
public static long ToLong(object input, long defaultValue)
{
return ToLongOrNull(input) ?? defaultValue;
}
/// <summary>
/// 转换为64位可空整型
/// </summary>
/// <param name="input">输入值</param>
/// <returns></returns>
public static long? ToLongOrNull(object input)
{
long result;
var success = long.TryParse(input.SafeString(), out result);
if (success)
{
return result;
}
try
{
var temp = ToDecimalOrNull(input, 0);
if (temp == null)
{
return null;
}
return System.Convert.ToInt64(temp);
}
catch
{
return null;
}
}
#endregion
#region ToFloat(float)
/// <summary>
/// 转换为32位浮点型并按指定小数位舍入
/// </summary>
/// <param name="input">输入值</param>
/// <param name="digits">小数位数</param>
/// <returns></returns>
public static float ToFloat(object input, int? digits = null)
{
return ToFloat(input, default(float), digits);
}
/// <summary>
/// 转换为32位浮点型并按指定小数位舍入
/// </summary>
/// <param name="input">输入值</param>
/// <param name="defaultValue">默认值</param>
/// <param name="digits">小数位数</param>
/// <returns></returns>
public static float ToFloat(object input, float defaultValue, int? digits = null)
{
return ToFloatOrNull(input, digits) ?? defaultValue;
}
/// <summary>
/// 转换为32位可空浮点型并按指定小数位舍入
/// </summary>
/// <param name="input">输入值</param>
/// <param name="digits">小数位数</param>
/// <returns></returns>
public static float? ToFloatOrNull(object input, int? digits = null)
{
float result;
var success = float.TryParse(input.SafeString(), out result);
if (!success)
{
return null;
}
if (digits == null)
{
return result;
}
return (float)Math.Round(result, digits.Value);
}
#endregion
#region ToDouble(double)
/// <summary>
/// 转换为64位浮点型并按指定小数位舍入温馨提示4舍6入5成双
/// </summary>
/// <param name="input">输入值</param>
/// <param name="digits">小数位数</param>
/// <returns></returns>
public static double ToDouble(object input, int? digits = null)
{
return ToDouble(input, default(double), digits);
}
/// <summary>
/// 转换为64位浮点型并按指定小数位舍入温馨提示4舍6入5成双
/// </summary>
/// <param name="input">输入值</param>
/// <param name="defaultValue">默认值</param>
/// <param name="digits">小数位数</param>
/// <returns></returns>
public static double ToDouble(object input, double defaultValue, int? digits = null)
{
return ToDoubleOrNull(input, digits) ?? defaultValue;
}
/// <summary>
/// 转换为64位可空浮点型并按指定小数位舍入温馨提示4舍6入5成双
/// </summary>
/// <param name="input">输入值</param>
/// <param name="digits">小数位数</param>
/// <returns></returns>
public static double? ToDoubleOrNull(object input, int? digits = null)
{
double result;
var success = double.TryParse(input.SafeString(), out result);
if (!success)
{
return null;
}
return digits == null ? result : Math.Round(result, digits.Value);
}
#endregion
#region ToDecimal(decimal)
/// <summary>
/// 转换为128位浮点型并按指定小数位舍入温馨提示4舍6入5成双
/// </summary>
/// <param name="input">输入值</param>
/// <param name="digits">小数位数</param>
/// <returns></returns>
public static decimal ToDecimal(object input, int? digits = null)
{
return ToDecimal(input, default(decimal), digits);
}
/// <summary>
/// 转换为128位浮点型并按指定小数位舍入温馨提示4舍6入5成双
/// </summary>
/// <param name="input">输入值</param>
/// <param name="defaultValue">默认值</param>
/// <param name="digits">小数位数</param>
/// <returns></returns>
public static decimal ToDecimal(object input, decimal defaultValue, int? digits = null)
{
return ToDecimalOrNull(input, digits) ?? defaultValue;
}
/// <summary>
/// 转换为128位可空浮点型并按指定小数位舍入温馨提示4舍6入5成双
/// </summary>
/// <param name="input">输入值</param>
/// <param name="digits">小数位数</param>
/// <returns></returns>
public static decimal? ToDecimalOrNull(object input, int? digits = null)
{
decimal result;
var success = decimal.TryParse(input.SafeString(), out result);
if (!success)
{
return null;
}
if (digits == null)
{
return result;
}
return Math.Round(result, digits.Value);
}
#endregion
#region ToBool(bool)
/// <summary>
/// 转换为布尔值
/// </summary>
/// <param name="input">输入值</param>
/// <returns></returns>
public static bool ToBool(object input)
{
return ToBool(input, default(bool));
}
/// <summary>
/// 转换为布尔值
/// </summary>
/// <param name="input">输入值</param>
/// <param name="defaultValue">默认值</param>
/// <returns></returns>
public static bool ToBool(object input, bool defaultValue)
{
return ToBoolOrNull(input) ?? defaultValue;
}
/// <summary>
/// 转换为可空布尔值
/// </summary>
/// <param name="input">输入值</param>
/// <returns></returns>
public static bool? ToBoolOrNull(object input)
{
bool? value = GetBool(input);
if (value != null)
{
return value.Value;
}
bool result;
return bool.TryParse(input.SafeString(), out result) ? (bool?)result : null;
}
/// <summary>
/// 获取布尔值
/// </summary>
/// <param name="input">输入值</param>
/// <returns></returns>
private static bool? GetBool(object input)
{
switch (input.SafeString().ToLower())
{
case "0":
case "否":
case "不":
case "no":
case "fail":
return false;
case "1":
case "是":
case "ok":
case "yes":
return true;
default:
return null;
}
}
#endregion
#region ToDate(DateTime)
/// <summary>
/// 转换为日期
/// </summary>
/// <param name="input">输入值</param>
/// <returns></returns>
public static DateTime ToDate(object input)
{
return ToDateOrNull(input) ?? DateTime.MinValue;
}
/// <summary>
/// 转换为可空日期
/// </summary>
/// <param name="input">输入值</param>
/// <returns></returns>
public static DateTime? ToDateOrNull(object input)
{
DateTime result;
return DateTime.TryParse(input.SafeString(), out result) ? (DateTime?)result : null;
}
#endregion
#region ToGuid(Guid)
/// <summary>
/// 转换为Guid
/// </summary>
/// <param name="input">输入值</param>
/// <returns></returns>
public static Guid ToGuid(object input)
{
return ToGuidOrNull(input) ?? Guid.Empty;
}
/// <summary>
/// 转换为可空Guid
/// </summary>
/// <param name="input">输入值</param>
/// <returns></returns>
public static Guid? ToGuidOrNull(object input)
{
Guid result;
return Guid.TryParse(input.SafeString(), out result) ? (Guid?)result : null;
}
/// <summary>
/// 转换为Guid集合
/// </summary>
/// <param name="input">输入值以逗号分隔的Guid集合字符串范例83B0233C-A24F-49FD-8083-1337209EBC9A,EAB523C6-2FE7-47BE-89D5-C6D440C3033A</param>
/// <returns></returns>
public static List<Guid> ToGuidList(string input)
{
return ToList<Guid>(input);
}
#endregion
#region ToList()
/// <summary>
/// 泛型集合转换
/// </summary>
/// <typeparam name="T">目标元素类型</typeparam>
/// <param name="input">输入值以逗号分隔的元素集合字符串范例83B0233C-A24F-49FD-8083-1337209EBC9A,EAB523C6-2FE7-47BE-89D5-C6D440C3033A</param>
/// <returns></returns>
public static List<T> ToList<T>(string input)
{
var result = new List<T>();
if (string.IsNullOrWhiteSpace(input))
{
return result;
}
var array = input.Split(',');
result.AddRange(from each in array where !string.IsNullOrWhiteSpace(each) select To<T>(each));
return result;
}
#endregion
#region ToEnum()
/// <summary>
/// 转换为枚举
/// </summary>
/// <typeparam name="T">枚举类型</typeparam>
/// <param name="input">输入值</param>
/// <returns></returns>
public static T ToEnum<T>(object input) where T : struct
{
return ToEnum<T>(input, default(T));
}
/// <summary>
/// 转换为枚举
/// </summary>
/// <typeparam name="T">枚举类型</typeparam>
/// <param name="input">输入值</param>
/// <param name="defaultValue">默认值</param>
/// <returns></returns>
public static T ToEnum<T>(object input, T defaultValue) where T : struct
{
return ToEnumOrNull<T>(input) ?? defaultValue;
}
/// <summary>
/// 转换为可空枚举
/// </summary>
/// <typeparam name="T">枚举类型</typeparam>
/// <param name="input">输入值</param>
/// <returns></returns>
public static T? ToEnumOrNull<T>(object input) where T : struct
{
T result;
var success = System.Enum.TryParse(input.SafeString(), true, out result);
if (success)
{
return result;
}
return null;
}
#endregion
#region To()
/// <summary>
/// 通用泛型转换
/// </summary>
/// <typeparam name="T">目标类型</typeparam>
/// <param name="input">输入值</param>
/// <returns></returns>
public static T To<T>(object input)
{
if (input == null)
{
return default(T);
}
if (input is string && string.IsNullOrWhiteSpace(input.ToString()))
{
return default(T);
}
Type type = Reflection.GetType<T>();
try
{
if (type.Name.ToLower() == "string")
{
return (T)(object)input.ToString();
}
if (type.Name.ToLower() == "guid")
{
return (T)(object)new Guid(input.ToString());
}
if (type.IsEnum)
{
return EnumHelper.Parse<T>(input);
}
if (input is IConvertible)
{
return (T)System.Convert.ChangeType(input, type);
}
return (T)input;
}
catch
{
return default(T);
}
}
#endregion
}
}