让我辗转反侧的泛型
先我们平时的编程中,如果有方法名和参数都相同,但返回类型不同的情况。这种情况不但用不了方法重载,还的修改让方法的名称不能相同。为了实现此功能,昨晚上一夜没睡好。就算我一根筋吧,呵呵。废话不多说了,先贴代码。
1 /// <summary> 2 /// 分页查询方法,适用于任何表或者视图 3 /// </summary> 4 /// <param name="tableName">要查询的表名或者视图名</param> 5 /// <param name="where">查询的where条件</param> 6 /// <param name="orderColumnName">要排序的字段名</param> 7 /// <param name="orderBy">排序方式</param> 8 /// <param name="startIndex">当前页数</param> 9 /// <param name="size">每页显示的记录条数</param> 10 /// <param name="parameters">查询中用到的参数集合</param> 11 /// <returns>返回分页查询结果</returns> 12 public DataTable QueryForDataTable(string tableName, string where, string orderColumnName, OrderBy orderBy, int startIndex, int size, IEnumerable<DbParameter> parameters) 13 { 14 return 。。。。。。 15 } 16 public IList<T> QueryForList<T>(string tableName, string where, string orderColumnName, OrderBy orderBy, int startIndex, int size, IEnumerable<DbParameter> parameters, Action<IDataReader, T> action = null) 17 { 18 return 。。。。。。 19 } 20 public string QueryForJson(string tableName, string where, string orderColumnName, OrderBy orderBy, int startIndex, int size, IEnumerable<DbParameter> parameters) 21 { 22 return 。。。。。。 23 }
这段代码是用来返回数据库分页的查询结果。这返回三种类型的结果:json字符串,DataTable,IList<T>。如果一个页面就3个方法,也能忍,但是当这种方法有很多时,真的是会让人很头疼。所以想用泛型方法来改进。
因为贴的代码显示效果不友好,就在此贴图了。这样一个方法就搞定了。感谢“合肥-杀破狼”兄弟提供了思路。
1.获得泛函数 QueryForList<>(我只能写到这,并获得参数类型argumentTypes。但往下不知如何实现了)
2.通过泛函数 使用 参数类型 生成具体的函数
3.执行目标函数
最后贴一下测试代码,循环一百万次,执行结果为10秒左右,因为我cpu比较烂。总是有很多人说反射影响性能。我只想说,这只是初步实现,并未用IL和Lambda进行编译优化。而且配合缓存,反射的影响真的不算什么。反正每个人观点不同,我们都应该尊重。而我宁愿牺牲少许性能,以换取代码的优雅。
1 protected void Page_Load(object sender, EventArgs e) 2 { 3 Stopwatch sw = new Stopwatch(); 4 sw.Start(); 5 for (int i = 0; i < 1000000; i++) 6 { 7 IList<string> list1 = GetResult<IList<string>>(new CommandInfo()); 8 9 //IList<int> list2 = GetResult<IList<int>>(new CommandInfo()); 10 } 11 12 sw.Stop(); 13 var time1 = sw.ElapsedMilliseconds / 1000.0; 14 Response.Write(time1 + "<br />"); 15 } 16 17 class CommandInfo { } 18 private IList<T2> QueryForList<T2>(CommandInfo ci) 19 { 20 IList<T2> list = new List<T2>(); 21 22 return list; 23 } 24 25 //1.获得泛函数 QueryForList<> 26 private static MethodInfo QueryForListMethod = typeof(Test).GetMethod("QueryForList", BindingFlags.Instance | BindingFlags.NonPublic, null, new Type[] { typeof(CommandInfo) }, null); 27 private T GetResult<T>(CommandInfo ci) where T : class 28 { 29 Type t = typeof(T); 30 if (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(IList<>)) 31 { 32 //假如传入的T是IList<int> IList<string> IList<User1Info> 33 Type[] argumentTypes = t.GetGenericArguments(); 34 35 //2.通过泛函数 使用 参数类型 生成具体的函数 36 var method = QueryForListMethod.MakeGenericMethod(argumentTypes); 37 38 //3.执行目标函数 39 object value = method.Invoke(this, new object[] { ci }); 40 return value as T; 41 } 42 return default(T); 43 }