笨鸟有个问题想请教大虾们,我现在有一个DataTable,想写一个通用的方法,把它转成List<T>这样的类型,但这个类型T可能是对象A、B或C,那么我这样能不能写成一个通用的方法,就是当传进来的类型是A时,就转换为List<A>这样一个集合返回,当是B时,就返回List<B>,以此类推......,当然,当类型不同时,DataTable中的数据内容肯定也不一样啦,还是说没有通用的方法,必须每个类型写一个方法呢,各位大虾,请给小弟给给建议吧,谢谢啦!!
调试欢乐多
泛型我也不熟悉,顺便来学习下~~~
List<T> MethodA<T>(T value)
{
return new List<T>();
}但是就是不太清楚你说的DataTable包含的数据类型是什么意思哈
List<Object T>
case when T is string then return List<string>
else when T is int then return List<int>
......乱写的伪代码,就是这个意思,可以考虑下。。
当然你进行ToList计算也行。但是往往这没有必要付出生成一个新的集合的空间。当使用foreach来遍历results集合时,就是以迭代器方式去直接访问dt的。
//反射实现public static List<T> toList<T>(this DataTable table)
{
List<T> list = new List<T>(); T item;
Type listItemType = typeof(T); for (int i = 0; i < table.Rows.Count; i++)
{
item = (T)Activator.CreateInstance(listItemType);
mapRow(item, table, listItemType, i);
list.Add(item);
}
return list;
}
private static void mapRow(object vOb, System.Data.DataTable table, Type type, int row)
{
for (int col = 0; col < table.Columns.Count; col++)
{
var columnName = table.Columns[col].ColumnName; var prop = type.GetProperty(columnName);
object data = getData(prop, table.Rows[row][col]);
prop.SetValue(vOb, data, null); }
} private static object getData(PropertyInfo prop, object value)
{
if (prop.PropertyType.Name.Equals("Int32"))
return Convert.ToInt32(value); if (prop.PropertyType.Name.Equals("Double"))
return Convert.ToDouble(value); if (prop.PropertyType.Name.Equals("DateTime"))
return Convert.ToDateTime(value); return Convert.ToString(value).Trim();
}