C# 数据表的实体类
我正在尝试创建一个通用类来保存日志 这里我们使用实体框架,所以假设我们有一个表 mng_用户(字符串usr_名称,int usr_id) 为itentity创建相应的类) 有没有办法实现toDataTable方法将实体转换为datatable(不是列表,只有一行),这样我就可以这样做: 将mng_users1和mng_users2作为mng_users实体类(两者具有相同的id但名称不同) 调用方法“savelog(mng_users1,mng_users2);” 并执行以下代码:C# 数据表的实体类,c#,datatable,entity,C#,Datatable,Entity,我正在尝试创建一个通用类来保存日志 这里我们使用实体框架,所以假设我们有一个表 mng_用户(字符串usr_名称,int usr_id) 为itentity创建相应的类) 有没有办法实现toDataTable方法将实体转换为datatable(不是列表,只有一行),这样我就可以这样做: 将mng_users1和mng_users2作为mng_users实体类(两者具有相同的id但名称不同) 调用方法“savelog(mng_users1,mng_users2);” 并执行以下代码: pr
private DataTable toDataTable(Object T)
{
DataTable vDataTable = new DataTable();
//AddColums here
//AddRow with the respective values here
return vDataTable;
}
public void savelog(Object newObject, Object oldObject)
{
DataTable newvalue, oldvalue;
newvalue = toDataTable(newObject);
oldvalue = toDataTable(oldObject);
string FieldNames = string.Empty, FieldValuesFrom = string.Empty, FieldValuesTo = string.Empty;
foreach (DataColumn item in newvalue.Columns)
{
if (newvalue.Rows[0][item].ToString() != oldvalue.Rows[0][item].ToString())
{
FieldNames += (FieldNames.Length > 0 ? " | " : string.Empty) + item.ColumnName;
FieldValuesFrom += (FieldValuesFrom.Length > 0 ? " | " : string.Empty) + newvalue.Rows[0][item].ToString();
FieldValuesTo += (FieldValuesTo.Length > 0 ? " | " : string.Empty) + oldvalue.Rows[0][item].ToString();
}
}
// Save log to sql code here
}
类似下面的代码应该可以工作。它可能需要根据属性是否为
私有
/受保护
以及是否为任何公共属性编制了索引进行调整,但这应该让您开始
private DataTable ToDataTable<T>(T entity) where T : class
{
var properties = typeof(T).GetProperties();
var table = new DataTable();
foreach(var property in properties)
{
table.Columns.Add(property.Name, property.PropertyType);
}
table.Rows.Add(properties.Select(p => p.GetValue(entity, null)).ToArray());
return table;
}
私有数据表到数据表(T实体),其中T:class
{
var properties=typeof(T).GetProperties();
var table=新数据表();
foreach(属性中的var属性)
{
table.Columns.Add(property.Name、property.PropertyType);
}
table.Rows.Add(properties.Select(p=>p.GetValue(entity,null)).ToArray();
返回表;
}
我对上述示例的改进:
- 将语法更改为扩展方法
- 现在扩展方法将现有的对象实体列表转换为数据表
- 添加了对可为null的属性类型的支持
public static DataTable ToDataTable<T>(this IEnumerable<T> entityList) where T : class { var properties = typeof(T).GetProperties(); var table = new DataTable(); foreach (var property in properties) { var type = Nullable.GetUnderlyingType(property.PropertyType) ?? property.PropertyType; table.Columns.Add(property.Name, type); } foreach (var entity in entityList) { table.Rows.Add(properties.Select(p => p.GetValue(entity, null)).ToArray()); } return table; }
公共静态数据表到数据表(此IEnumerable entityList),其中T:class { var properties=typeof(T).GetProperties(); var table=新数据表(); foreach(属性中的var属性) { var type=Nullable.GetUnderlineType(property.PropertyType)??property.PropertyType; table.Columns.Add(property.Name,type); } foreach(entityList中的var实体) { table.Rows.Add(properties.Select(p=>p.GetValue(entity,null)).ToArray(); } 返回表; }