محتویات سایت
        برچسب های محبوب 








 
   نوشتن متدی برای تبدیل یک لیست جنریک به DataTable
  در این مقاله با استفاده از متدهای توسعه گر (Extension Methods)، متدی جنریک جهت تبدیل یک لیست جنریک به Datatable خواهیم نوشت.
   C#
   ۲۰۱۳۲
   دریافت فایل ضمیمه
   مرتضی صحراگرد
   ۱۳۸۷/۶/۲۲
نسخه قابل چاپ نسخه قابل چاپ

تذکر :

برای درک صحیح روش انجام گرفته در متدهای این مقاله، آشنایی مقدماتی با مقوله Reflection الزامی می باشد.

برای تبدیل لیست مورد نظر به یک DataTable ما از یک متد توسعه گر (Extension Method) استفاده نموده ایم. و این متد در داخل خود متد دیگری را فراخوانی می کند.

به قطعه کد زیر توجه فرمایید.


public static DataTable ConvertToDatatable<T>(this IList<T> GenericList, IList<T> list)
{
   DataTable table = new DataTable();
   if (list.Count > 0)
   {
      // بازیابی خصوصیات لیست
      PropertyInfo[] properties = list[0].GetType().GetProperties();
      List<string> columns = new List<string>();
      // ایجاد ستون های جدول با استفاده از نام و نوع خصوصیات لیست
      foreach (PropertyInfo pi in properties)
      {
         table.Columns.Add(pi.Name);
         columns.Add(pi.Name);
      }
       foreach (T item in list)
      {
         // به ازای تمامی آیتم های موجود در لیست این تابع فراخوانی شده
         //و با هر بار فراخوانی آرایه ای از مقادیری که باید به جدول اضافه شوند، برگردانده می شود
      object[] cells = GetValues(columns, item);
      table.Rows.Add(cells);
       }
   }
return table;
}
/// <summary>
///
www.30sharp.com
/// </summary>
///
<param name="listOfColumnNames">این لسیت شامل نام ستون های جدول و یا به عبارت دیگر نام خصوصیات لیست می باشد</param>
///
<param name="instance">آیتمی که قرار است مقادیر خصوصیات آن در در یک رکورد جدول ذخیره کنیم</param>
///
<returns>آرایه ای که شامل مقادیر خصوصیات آیتم ارسال شده به متد می باشد</returns>
private static object[] GetValues(IList<string> listOfColumnNames, object instance)
{

   object[] arrColumnValues = new object[listOfColumnNames.Count];

   for (int n = 0; n < arrColumnValues.Length; n++)
      {
         // بازیابی خصوصیت مر آیتم بر اساس نام خصوصیت
         PropertyInfo pi = instance.GetType().GetProperty(listOfColumnNames[0]);
         // باز یابی مقدار خصوصیت
         object value = pi.GetValue(instance, null);
         // ذخیره مقدار بازیابی شده در آرایه
         arrColumnValues[n] = value;
      }
   return arrColumnValues;
}

قطعه کد کاملا واضح می باشد.

متد GetValues لیستی از نام ستون های جدول و آیتمی از لیست که قرار است مقادیر آن بازیابی شود را دریافت می کند و مقادیری که باید در هر ستون ذخیره شوند را به صورت آرایه ای از آبجکت ها، برمی گرداند.

نحوه استفاده از قطعه کد بالا به شکل زیر می باشد. فرض می کنیم کلاسی به نام User داریم که مشخصات کاربران شامل نام و نام خانوادگی و غیره را نگهداری می کند.


public class User
{
   public string FName { get; set; }
   public string LName { get; set; }
}
// نحوه استفاده
List<User> lst = new List<User>() ;
// پر کردن لیست 
//...
//...
DataTable tb= lst.ConvertToDatatable(lst);

مثال انجام شده در این مقاله از طریق لینک بالای صفحه قابل دریافت می باشد.