日期:2014-05-18  浏览次数:20976 次

如何使泛型的参数是通用的?
 
比如如下的函数,编译会报错,说找不到T,但我传参时是需要不同的实体类的名称的
比如FillDataTable(modelList) modelList是名称是DM_GBK的实体类,
如何使List<T> modelList 里的T是通用的?
  /// <summary>
  /// 实体类转换成DataTable
  /// </summary>
  /// <param name="modelList">实体类列表</param>
  /// <returns></returns>
  public static DataTable FillDataTable(List<T> modelList)
  {
  if (modelList == null || modelList.Count == 0)
  {
  return null;
  }
  DataTable dt = CreateData(modelList[0]);

  foreach (T model in modelList)
  {
  DataRow dataRow = dt.NewRow();
  foreach (PropertyInfo propertyInfo in typeof(T).GetProperties())
  {
  dataRow[propertyInfo.Name] = propertyInfo.GetValue(model, null);
  }
  dt.Rows.Add(dataRow);
  }
  return dt;
  }

  /// <summary>
  /// 根据实体类得到表结构
  /// </summary>
  /// <param name="model">实体类</param>
  /// <returns></returns>
  private static DataTable CreateData(T model)
  {
  DataTable dataTable = new DataTable(typeof(T).Name);
  foreach (PropertyInfo propertyInfo in typeof(T).GetProperties())
  {
  dataTable.Columns.Add(new DataColumn(propertyInfo.Name, propertyInfo.PropertyType));
  }
  return dataTable;
  }


------解决方案--------------------
探讨
比如如下的函数,编译会报错,说找不到T,但我传参时是需要不同的实体类的名称的

------解决方案--------------------
败给lz了,这回真的不知道你要做什么了。理解泛型本身比理解lz的想法简单多了。
------解决方案--------------------
还是使用ArrayList,泛型必须使用指定类型。
------解决方案--------------------
public static DataTable FillDataTable(List<T> modelList)
这个就不对
public static DataTable FillDataTable<T>(List<T> modelList)
看看。
------解决方案--------------------
public static DataTable FillDataTable<T>(List<T> modelList)
------解决方案--------------------
探讨

还是使用ArrayList,泛型必须使用指定类型。

------解决方案--------------------
同意楼上的看法
探讨

败给lz了,这回真的不知道你要做什么了。理解泛型本身比理解lz的想法简单多了。

------解决方案--------------------
只是个语法错误:
public static DataTable FillDataTable(List<T> modelList) 中少了FillDataTable<T>
不过你这里用不用泛型没啥差别吧,你不如用object好了。
------解决方案--------------------
有点不太明白,为什么不能用object呢?