随手写的一个对DataRow和DataSqlReader的扩展方法

因为觉得一般使用DataRow获取行数据时使用字符串 会有太多的不确定和类型判断所以想自己扩展一下

最后成果

public class Model{public int objUserID { get; set; }public string FirstName { get; set; }}class Program{static void Main(string[] args){DataRow r = null;var contact= r.GetContact<Model>();//声明一个DataRow的链接//获取值类型var id=contact.GetValue(s => s.objUserID,s=>int.Parse(s));//获取引用类型var name = contact.GetClassValue(s => s.FirstName);//直接获取int类型id = contact.GetValueByDBNull(s => s.objUserID);System.Data.SqlClient.SqlDataReader reader = null;contact = reader.GetContact<Model>();//声明一个SqlDataReader的链接//获取值类型id = contact.GetValue(s => s.objUserID);//直接获取int类型id = contact.GetValueByDBNull(s => s.objUserID);}}

开始定义一部分接口,公开外部可访问的方法

public interface ContactBase<T>{/// <summary>/// 获取值类型/// </summary>TResult GetValue<TResult>(System.Linq.Expressions.Expression<Func<T, TResult>> exp, Func<string, TResult> convert=null);/// <summary>/// 获取引用类型/// </summary>TResult GetClassValue<TResult>(System.Linq.Expressions.Expression<Func<T, TResult>> exp,Func<object,TResult> convert=null)where TResult :class;/*获取指定类型*/int GetValueByDBNull(System.Linq.Expressions.Expression<Func<T, int>> exp);int GetValueByDBNull(System.Linq.Expressions.Expression<Func<T, double>> exp);int GetValueByDBNull(System.Linq.Expressions.Expression<Func<T, string>> exp);}然后写根据接口定义的抽象类,里面写一些工具方法和公共属性

public abstract class ContactTools<T,TData>:ContactBase<T>{/// <summary>/// 存放row或reader的值/// </summary>private TData _data;protected ContactTools(TData data){this._data = data;}/// <summary>/// 通过lambda获取row或reader值/// </summary>private object GetDBValue<TResult>(System.Linq.Expressions.Expression<Func<T, TResult>> exp, Func<string, object> getFunc){if (exp == null || getFunc == null)return default(TResult);var member = exp.Body as System.Linq.Expressions.MemberExpression;var name = member.Member.Name;return getFunc(name);}/// <summary>/// 需要继承的改变/// </summary>public abstract virtual object GetData(TData data,string name);public TResult GetValue<TResult>(System.Linq.Expressions.Expression<Func<T, TResult>> exp, Func<string, TResult> convert = null){var value = this.GetDBValue(exp,s=>this.GetData(this._data,s));if (value == DBNull.Value)return default(TResult);if (string.IsNullOrEmpty(value.ToString()))return default(TResult);if (convert == null)return (TResult)value;elsereturn convert(value.ToString());}public TResult GetClassValue<TResult>(System.Linq.Expressions.Expression<Func<T, TResult>> exp, Func<object, TResult> convert = null)where TResult : class{var value = this.GetDBValue(exp, s => this.GetData(this._data, s));if (value == DBNull.Value)return null;if (convert == null)return value as TResult;elsereturn convert(value);}public int GetValueByDBNull(System.Linq.Expressions.Expression<Func<T, int>> exp){return this.GetValue(exp, s => int.Parse(s));}public double GetValueByDBNull(System.Linq.Expressions.Expression<Func<T, double>> exp){return this.GetValue(exp, s => double.Parse(s));}public string GetValueByDBNull(System.Linq.Expressions.Expression<Func<T, string>> exp){var str =this.GetClassValue(exp);return str == null ? string.Empty : str;}}

然后实现DataRow

public class DataRowContact<T> : ContactTools<T, DataRow>{public DataRowContact(DataRow row):base(row){}public override object GetData(DataRow data, string name){return data[name];}}实现DataSqlReader public class DataReaderContact<T> : ContactTools<T, System.Data.SqlClient.SqlDataReader>{public DataReaderContact(System.Data.SqlClient.SqlDataReader reader) : base(reader) { }public override object GetData(System.Data.SqlClient.SqlDataReader data, string name){return data[name];}}最后写扩展方法,扩展到DataRow和DataSqlReader中

public static class MyLinq{public static ContactBase<T> GetContact<T>(this DataRow row){return new DataRowContact<T>(row);}public static ContactBase<T> GetContact<T>(this System.Data.SqlClient.SqlDataReader reader){return new DataReaderContact<T>(reader);}}

,走过的路成为背后的风景,不能回头不能停留,若此刻停留,

随手写的一个对DataRow和DataSqlReader的扩展方法

相关文章:

你感兴趣的文章:

标签云: