using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Web; namespace VueWebApi.Util { /// /// 值转换器 /// /// 指定值的类型 /// 取值来源 /// 返回指定类型的值 [Serializable] public delegate T ObjectValueParser(object obj); /// /// 尝试将值转换成指定类型 返回转换结果 /// /// 指定值的类型 /// 取值来源 /// 若转换成功 则out转换结果 否则 out默认T类型值 /// public delegate bool ObjectValueTryParser(object obj, out T valueOutput); /// /// 尝试将值转换成指定类型 返回转换结果 /// /// 指定值的类型 /// 取值来源字符串 /// 返回指定类型的值 [Serializable] public delegate T StringValueParser(string str); /// /// 尝试将值转换成指定类型 返回转换成功与否 /// /// 指定值的类型 /// 取值来源字符串 /// 若转换成功 则out转换结果 否则 out默认T类型值 /// [Serializable] public delegate bool StringValueTryParser(string str, out T valueOutput); /// /// 实体帮助类 /// public class EntityHelper { /// /// 从一行数据中尝试获取指定列名的值 /// /// 源数据行 /// 指定列名 /// 若指定的列名存在并有效则返回取到的对象,若指定列名不存在或者为无效数据则返回null public static object GetObject(DataRow dr, string columnName) { if (dr != null && dr.Table.Columns.Contains(columnName) && dr[columnName] != null && dr[columnName] != DBNull.Value) return dr[columnName]; return null; } /// /// 从一行数据中尝试获取指定引用类型的值 /// /// 指定类型的值 /// 源数据行 /// 列名 /// 列无效时返回的默认值 /// 值转换器 若给定的值转换器为null,则使用as强制转换,若as转换为null 则返回默认值 /// public static T GetT(DataRow dr, string columnName, T defVal, ObjectValueParser parser = null) where T : class { var obj = GetObject(dr, columnName); return Get(obj, defVal, parser); } /// /// 将对象转换为指定类型数据 转换失败返回设置的默认值 /// /// 指定的类型 /// 数据源 /// 列无效时返回的默认值 /// 值转换器 若给定的值转换器为null,则使用as强制转换,若as转换为null 则返回默认值 /// public static T Get(object source, T defVal, ObjectValueParser parser = null) where T : class { if (source == null) return defVal; if (parser != null) { return parser(source); } return source as T ?? defVal; } /// /// 从一行数据中尝试获取指定引用类型的值 /// /// 指定的类型 /// 源数据行 /// 列名 /// 列无效时返回的默认值 /// 值转换器 若给定的值转换器为null,则使用as强制转换,若as转换为null 则返回默认值 /// public static T TryGetT(DataRow dr, string columnName, T defVal, ObjectValueTryParser parser = null) where T : class { var obj = GetObject(dr, columnName); return TryGetT(obj, defVal, parser); } /// /// 将对象尝试转换为指定类型的数据 转换失败返回指定的默认值 /// /// 指定的类型 /// 数据源 /// 默认值 /// 值转换器 若给定的值转换器为null,则使用as强制转换,若as转换为null 则返回默认值 /// public static T TryGetT(object source, T defVal, ObjectValueTryParser parser = null) where T : class { if (source == null) return defVal; if (parser == null) return source as T ?? defVal; T temp; if (parser(source, out temp)) { return temp; } return source as T ?? defVal; } /// /// 从一行数据中尝试获取指定值类型的值 /// /// 指定类型的值 /// 源数据行 /// 列名 /// 列无效时返回的默认值 /// 值转换器 /// public static T GetT(DataRow dr, string columnName, T defVal, StringValueParser parser) where T : struct { var obj = GetObject(dr, columnName); return GetT(obj, defVal, parser); } /// /// 将对象转换为指定类型数据 转换失败返回设置的默认值 /// /// 指定的类型 /// 数据源 /// 列无效时返回的默认值 /// 值转换器 /// public static T GetT(object source, T defVal, StringValueParser parser) where T : struct { return source != null ? parser(source.ToString()) : defVal; } /// /// 从一行数据中尝试获取指定值类型的值 /// /// 指定类型的值 /// 源数据行 /// 列名 /// 列无效时返回的默认值 /// 值转换器 /// public static T TryGetT(DataRow dr, string columnName, T defVal, StringValueTryParser parser) where T : struct { var obj = GetObject(dr, columnName); return TryGetT(obj, defVal, parser); } /// /// 将对象尝试转换为指定类型的数据 转换失败返回指定的默认值 /// /// 指定的类型 /// 数据源 /// 默认值 /// 值转换器 /// public static T TryGetT(object obj, T defVal, StringValueTryParser parser) where T : struct { if (obj != null) { T val; if (parser(obj.ToString(), out val)) { return val; } } return defVal; } /// /// 从一行数据中尝试获取字符串 /// /// 源数据行 /// 列名 /// 列无效时返回的默认值 /// public static string GetString(DataRow dr, string columnName, string defVal) { var obj = GetObject(dr, columnName); return obj != null ? obj.ToString() : defVal; } /// /// 获取字符串 检测 数据源为空时返回默认值 /// /// 数据源 /// 默认值 /// public static string GetString(object source, string defVal) { if (source != null) { return source as string ?? source.ToString(); } return defVal; } /// /// 从一行数据中尝试获取整数 /// /// 源数据行 /// 列名 /// 列无效时返回的默认值 /// public static int GetInt(DataRow dr, string columnName, int defVal) { return TryGetT(dr, columnName, defVal, int.TryParse); } /// /// 从数据员获取整数 /// /// 数据源 /// 获取失败时的默认值 /// public static int GetInt(object source, int defVal) { return TryGetT(source, defVal, int.TryParse); } /// /// 从一行数据中尝试获取日期 /// /// 源数据行 /// 列名 /// 列无效时返回的默认值 /// public static DateTime GetDateTime(DataRow dr, string columnName, DateTime defVal) { return TryGetT(dr, columnName, defVal, DateTime.TryParse); } /// /// 从数据源中 获取日期 /// /// 数据源 /// 获取失败时的默认值 /// public static DateTime GetDateTime(object source, DateTime defVal) { return TryGetT(source, defVal, DateTime.TryParse); } } }