我正在尝试创建一个保存日志的通用类
这里我们使用实体框架,所以想象我们有表 mng_users(string usr_name,int usr_id) 为itentity创建相应的类)
有没有办法实现toDataTable方法将实体转换为数据表(不是列表,只有1行)所以我可以做这样的事情:
将mng_users1和mng_users2作为mng_users实体类(两者具有相同的id但是diff名称)
调用方法“savelog(mng_users1,mng_users2);” 并执行以下代码:
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
}
答案 0 :(得分:11)
以下代码之类的东西应该可行。它可能需要调整,具体取决于属性是private
/ protected
,以及是否有任何公共属性被编入索引,但它应该让你开始。
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;
}
答案 1 :(得分:7)
我对上述样本的改进:
添加了对Nullable属性类型的支持
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;
}