zhaolei
7 days ago 4a2e5b9a21940f11757be37d99f0944e240e908b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
using System;
using System.ComponentModel;
using System.Reflection;
 
namespace Longbow
{
    /// <summary>
    /// 数据转化操作类
    /// </summary>
    public static class LgbConvert
    {
#nullable disable
        /// <summary>
        /// 将数据类型转换为指定的数据类型,转换失败则将其初始化为默认值
        /// </summary>
        /// <typeparam name="T">返回的数据类型</typeparam>
        /// <param name="source">原数据</param>
        /// <param name="defaultValue">转化后的数据默认值</param>
        /// <returns>返回的数据类型实例值</returns>
        public static T ReadValue<T>(object source, T defaultValue = default)
        {
            if (source == null || source.ToString() == string.Empty || source == DBNull.Value) return defaultValue;
 
            return TryConvertValue(typeof(T), source.ToString(), out var result) ? (T)result : defaultValue;
        }
#nullable restore
 
        /// <summary>
        /// 判断字符串是否可以转换为目标类型
        /// </summary>
        /// <param name="type">指定类型</param>
        /// <param name="value">字符串</param>
        /// <param name="result">转换结果</param>
        /// <returns></returns>
        private static bool TryConvertValue(Type type, string value, out object? result)
        {
            result = null;
            if (type == typeof(object))
            {
                result = value;
                return true;
            }
 
            if (type.GetTypeInfo().IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) return TryConvertValue(Nullable.GetUnderlyingType(type), value, out result);
 
            var converter = TypeDescriptor.GetConverter(type);
            if (converter.CanConvertFrom(typeof(string)))
            {
                try
                {
                    result = converter.ConvertFromInvariantString(value);
                    return true;
                }
                catch { }
            }
 
            return false;
        }
    }
}