9

ログを保存するためのジェネリッククラスを作成しようとしています

ここではエンティティフレームワークを使用しているので、テーブルmng_users(string usr_name、int usr_id)がitentityのそれぞれのクラスを作成していると想像してください)

エンティティをデータテーブル(リストではなく、1行のみ)に変換するtoDataTableメソッドを実装する方法があるので、次のようなことができます。

mng_users1とmng_users2をmng_usersエンティティクラスとして持つ(両方とも同じIDで、異なる名前を持つ)

メソッド「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
    }
4

2 に答える 2

12

以下のコードのようなものが動作するはずです。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;
}
于 2012-11-28T13:56:47.943 に答える