2012-11-28 31 views
7

Tôi đang cố gắng để tạo ra một lớp tổng quát để lưu logEntity lớp DataTable

Ở đây chúng ta sử dụng khuôn khổ tổ chức để tưởng tượng chúng ta có bảng mng_users (string usr_name, int usr_id) tạo lớp tương ứng cho itentity)

là có một cách để thực hiện các phương pháp toDataTable chuyển đổi đơn vị vào một DataTable (không phải là một danh sách, có 1 hàng duy nhất) vì vậy tôi có thể làm một cái gì đó như thế này:

có mng_users1 và mng_users2 như lớp mng_users thực thể (cả hai có cùng tên id nhưng khác)

phương thức gọi "savelog (mng_users1, mng_users2);" và thực hiện các mã sau:

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 
    } 

Trả lời

9

Điều gì đó giống như mã bên dưới sẽ hoạt động. Nó có thể cần phải được tinh chỉnh tùy thuộc vào việc tài sản là private/protected và nếu bất kỳ thuộc tính công cộng nào được lập chỉ mục, nhưng nó sẽ giúp bạn bắt đầu.

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; 
} 
+0

Xin chào, nó thực sự làm việc với một số chỉnh sửa ... nhưng tôi không thể sử dụng phương thức ToDataTable, tôi đã phải sử dụng nó trong phương thức SaveLog. – user1859887

+0

bạn luôn có thể trích xuất một phương thức từ mã nội tuyến. Tôi thấy tôi quên đặt kiểu trả về của phương thức. nó sẽ hoạt động ngay bây giờ. –

+0

@ user1859887 là ** SaveLog **? – Kiquenet

5

cải thiện của tôi để ví dụ trên:

  • thay đổi cú pháp để mở rộng phương pháp
  • nay phương pháp khuyến nông chuyển đổi hiện danh sách thực thể đối tượng vào một DataTable
  • thêm hỗ trợ cho các loại tài sản 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; 
    }