A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 许王斌 中级黑马   /  2012-12-5 10:20  /  1461 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

怎样更好的理解泛型和反射呢?
总感觉不太会用泛型,相应的书本也看了,练习也做了一些,但是感觉效果不好,理解不到位,哪位大侠再给讲讲
上一段sqlHelper的代码:
  1. #region 2.0升级泛型版本 +static List<T2> ExcuteList<T2>(string strSelectCmd, params SqlParameter[] paras)
  2.         /// <summary>
  3.         /// 2.0升级泛型版本
  4.         /// </summary>
  5.         /// <typeparam name="T2">泛型类型</typeparam>
  6.         /// <param name="strSelectCmd">查询sql语句</param>
  7.         /// <param name="paras">查询参数</param>
  8.         /// <returns>泛型集合</returns>
  9.         public static List<T2> ExcuteList<T2>(string strSelectCmd, params SqlParameter[] paras)
  10.         {
  11.             using (SqlConnection conn = new SqlConnection(connStr))
  12.             {
  13.                 SqlDataAdapter da = new SqlDataAdapter(strSelectCmd, conn);
  14.                 da.SelectCommand.Parameters.AddRange(paras);
  15.                 DataTable dt = new DataTable();
  16.                 da.Fill(dt);

  17.                 //将DataTable转成泛型集合List<T2>
  18.                 if (dt.Rows.Count > 0)
  19.                 {
  20.                     List<T2> list = new List<T2>();
  21.                     foreach (DataRow row in dt.Rows)
  22.                     {
  23.                         //(1)获得泛型类型
  24.                         Type t = typeof(T2);
  25.                         //(2)根据类型创建该类型的对象
  26.                         T2 model = (T2)Activator.CreateInstance(t);
  27.                         //(3)根据类型 获得 该类型所有属性定义
  28.                         PropertyInfo[] properties = t.GetProperties();
  29.                         //(4)遍历属性数组
  30.                         foreach (PropertyInfo p in properties)
  31.                         {
  32.                             string colName = p.Name;
  33.                             object colValue = row[colName];
  34.                             p.SetValue(model, colValue, null);
  35.                         }
  36.                         list.Add(model);
  37.                     }
  38.                     return list;
  39.                 }
  40.             }
  41.             return null;
  42.         }
  43.         #endregion
复制代码

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

3 个回复

倒序浏览
泛型集合用的多 泛型方法我不太用 但也差不多吧 就是参数 方法体 和返回值可以用泛型占位符代替 泛型类我更少用了
反射就了解Type类的方法就行了。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
这个代码里主要是用反射吧,关于反射建议还是先了解它的概念和用途,然后看代码,按照顺序一步步来就知道反射是拿来做什么和怎么用了
回复 使用道具 举报
C#泛型反射和普通反射的区别,泛型反射和普通反射的区别就是泛型参数的处理上

先看一个简单的例子。

class Class1<T>
{
  public void Test(T t)
  {
    Console.WriteLine(t);
  }
}

要利用反射动态创建该类型实例,并调用 Test 方法,我们可以使用如下方法

Type type = typeof(Class1<int>);
object o = Activator.CreateInstance(type);
type.InvokeMember("Test", BindingFlags.Default | BindingFlags.InvokeMethod, null, o, new object[] { 123 });

但如果泛型参数是未定的,我们该如何处理呢?其实 Type 已经增加了类似的处理机制。

static void InvokeTest(Type t, params object[] args)
{
  Type type = typeof(Class1<>);
  type = type.MakeGenericType(t);
  object o = Activator.CreateInstance(type);
  type.InvokeMember("Test", BindingFlags.Default | BindingFlags.InvokeMethod, null, o, args);
}

另外一种情况就是泛型方法,
class Class1
{
  public void Test<T>(T t)
  {
    Console.WriteLine(t);
  }
}

方法类似,只不过这回使用的是 MethodInfo.MakeGenericMethod()

static void InvokeTest(Type t, params object[] args)
{
  Type type = typeof(Class1);
  object o = Activator.CreateInstance(type);
  MethodInfo method = type.GetMethod("Test", BindingFlags.Instance | BindingFlags.Public);

  method = method.MakeGenericMethod(t);
  method.Invoke(o, args);
}

当然还有实例化一个泛型
例如有GenericType<M,N>
Type genericType = typeof(GenericType<>);
Type[] templateTypeSet = new[] { typeof(string), typeof(int) };
Type implementType = genericType.MakeGenericType( templateTypeSet );
这样 implementType类型就是赋予了string,int的泛型类了

评分

参与人数 1技术分 +1 收起 理由
郑文 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马