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