using System; using System.Globalization; namespace Masuit.Tools { public static class IConvertibleExtensions { /// /// 类型直转 /// /// /// /// public static T ConvertTo(this IConvertible value) where T : IConvertible { return (T)ConvertTo(value, typeof(T)); } /// /// 类型直转 /// /// /// /// 转换失败的默认值 /// public static T TryConvertTo(this IConvertible value, T defaultValue = default) where T : IConvertible { try { return (T)ConvertTo(value, typeof(T)); } catch { return defaultValue; } } /// /// 类型直转 /// /// /// /// 转换失败的默认值 /// public static bool TryConvertTo(this IConvertible value, out T result) where T : IConvertible { try { result = (T)ConvertTo(value, typeof(T)); return true; } catch { result = default; return false; } } /// /// 类型直转 /// /// /// 目标类型 /// 转换失败的默认值 /// public static bool TryConvertTo(this IConvertible value, Type type, out object result) { try { result = ConvertTo(value, type); return true; } catch { result = default; return false; } } /// /// 类型直转 /// /// /// 目标类型 /// public static object ConvertTo(this IConvertible value, Type type) { if (null == value) { return default; } if (type.IsEnum) { return Enum.Parse(type, value.ToString(CultureInfo.InvariantCulture)); } if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) { var underlyingType = Nullable.GetUnderlyingType(type); return underlyingType!.IsEnum ? Enum.Parse(underlyingType, value.ToString(CultureInfo.CurrentCulture)) : Convert.ChangeType(value, underlyingType); } return Convert.ChangeType(value, type); } } }