对于参数类型的判断,可以自己扩展一下。
代码中给出了注释,这里就不对代码过多讲述。
/// <summary>
/// DAL层帮助类,ADO .NET参数化数据操作,可变T类型参数帮助类
/// </summary>
/// <typeparam name="T"></typeparam>
public class DalGenericityHelper<T>
{
/// <summary>
/// 将List实体类集合转为DataTable
/// </summary>
/// <param name="inputList">传入的集合</param>
/// <returns></returns>
public static DataTable ConvertToDataTable(List<T> inputList)
{
//用于存放实体类转换过来的数据表
DataTable dataTable = new();
Type questionType = typeof(T);
//获取类的所有属性
PropertyInfo[] propertyInfos = questionType.GetProperties();
//存放DataTable的列集合
DataColumn[] dataColumns = new DataColumn[propertyInfos.Length];
//自增下标,用来从获取的属性集合中去出数据
int listIndex = 0;
foreach (PropertyInfo propertyInfo in propertyInfos)
{
//不实例化,当前下标的只为null,不可操作
dataColumns[listIndex] = new DataColumn();
//设置表格中这一列的名称和数据类型
dataColumns[listIndex].ColumnName = propertyInfo.Name;//属性名称
//属性的数据类型,如果是int?类型,赋值会出错,所以需要判断一下
dataColumns[listIndex].DataType = propertyInfo.PropertyType == typeof(int?) ? typeof(int) : propertyInfo.PropertyType;
//判断自增下标
if (listIndex == propertyInfos.Length - 1)
{
break;
}
else
{
listIndex++;
}
}
//将设置的列集合加入到DataTable表格
dataTable.Columns.AddRange(dataColumns);
//遍历实体类集合
foreach (var tempInput in inputList)
{
//生成新的一行
DataRow dataRow = dataTable.NewRow();
//遍历实体类属性等的集合,通过属性名称和类型获取实体类指定属性值
foreach (PropertyInfo peroperty in propertyInfos)
{
//特殊参数的处理,方便数据库存储
//bool类型转为int
if (peroperty.PropertyType == typeof(bool))
{
//获取值,为空默认false
object objectValue = peroperty.GetValue(tempInput) ?? "false";
//类型转换判断并赋值
bool judgeIsBool = Convert.ToBoolean(objectValue);
dataRow[peroperty.Name] = judgeIsBool ? 1 : 0;
}
//List<string>转为字符串,方便数据库存储
//propertyType.IsGenericType():判断属性类型是否为泛型类型的布尔值
//propertyType.GetGenericTypeDefinition():用于获取泛型类型的定义
else if (peroperty.PropertyType.IsGenericType && peroperty.PropertyType.GetGenericTypeDefinition() == typeof(List<>))
{
//动态获取值
object objectValue = peroperty.GetValue(tempInput) ?? new List<string>();
List<string>? tempIsList = objectValue as List<string>;
//利用封装的方法转换为字符串,等同于JsonConvert.SerializeObject()
dataRow[peroperty.Name] = DalHelper.ConvertListToString(tempIsList);
}
//int?类型,值为null了,无法进行存储
else if (peroperty.PropertyType == typeof(int?))
{
//无其他特殊的类型存储,则直接进行获取、赋值
dataRow[peroperty.Name] = peroperty.GetValue(tempInput) ?? 0;
}
else
{
//无其他特殊的类型存储,则直接进行获取、赋值
dataRow[peroperty.Name] = peroperty.GetValue(tempInput);
}
}
dataTable.Rows.Add(dataRow);
}
return dataTable;
}
}