让我辗转反侧的泛型

  先我们平时的编程中,如果有方法名和参数都相同,但返回类型不同的情况。这种情况不但用不了方法重载,还的修改让方法的名称不能相同。为了实现此功能,昨晚上一夜没睡好。就算我一根筋吧,呵呵。废话不多说了,先贴代码。

 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         }
测试代码

 

posted on 2016-01-04 13:33  杜军(橘仙)  阅读(330)  评论(0编辑  收藏  举报

导航