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