2012-03-16 37 views
0

我想使用這裏發現功能: DataTable to List<object>無效的參數錯誤使用泛型

public static IList<T> ConvertTo<T>(DataTable table) 
     { 
      if (table == null) 
       return null; 

      List<DataRow> rows = new List<DataRow>(); 

      foreach (DataRow row in table.Rows) 
       rows.Add(row); 

      return ConvertTo<T>(rows); 
     } 

return語句是給我一個例外,指出:

The best overloaded method match for 'Utilities.Utility.ConvertTo<T>(System.Data.DataTable)' has some invalid arguments 

有人可以幫我解決這個問題錯誤??

+1

這是一個_compiler error_,而不是一個例外。 – SLaks 2012-03-16 18:39:13

+0

你讀過這條消息嗎?你期望那條線做什麼? – SLaks 2012-03-16 18:39:27

+1

你可以用'table.AsEnumerable()來替換整個函數。ToList()' – SLaks 2012-03-16 18:40:03

回答

1

不要這樣做使用馬克的驚人功能(https://stackoverflow.com/a/545429/215752)我的意思是真的......那正是你想要的......對吧?


您需要另一個功能

public static IList<T> ConvertTo<T>(IList<DataRow> rows) 
    { 
     IList<T> list = null; 

     if (rows != null) 
     { 
      list = new List<T>(); 

      foreach (DataRow row in rows) 
      { 
       T item = CreateItem<T>(row); 
       list.Add(item); 
      } 
     } 

     return list; 
    } 

您鏈接曾在一個鏈接的問題。我建議找有更多的信息:

http://lozanotek.com/blog/archive/2007/05/09/Converting_Custom_Collections_To_and_From_DataTable.aspx

在那裏,你會發現所有的代碼,我希望將編譯。但我不會保證可靠性或合理使用它。

+0

我不知道如何使用它將數據錶轉換爲IList 它告訴我不能隱式地將類型'System.Collections.Generic.List >'轉換爲' System.Collections.Generic.List ' – 2012-03-16 18:57:53

+0

聽起來像一個錯字或Olivier Jacot-Descombes回答的評論 – Hogan 2012-03-16 18:59:21

+0

我不能讓你的或Olivers函數工作,當我想返回IList 2012-03-16 19:05:02

1

首先,您要退回T而不是IList<T>。其次,您如何期待DataRow轉換爲未知的T,特別是如果一行有幾列?

嘗試是這樣的

public static IList<IList<T>> ConvertTo<T>(DataTable table) 
{ 
    if (table == null) 
     return null; 
    List<IList<T>> rows = new List<IList<T>>(); 
    foreach (DataRow row in table.Rows) { 
     rows.Add(row.ItemArray.Cast<T>().ToArray()); 
    } 
    return rows; 
} 

UPDATE:

自定義對象是這樣的

public class Employee 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public decimal Salary { get; set; } 
} 

然而,在這種情況下,一個通用的接口是沒有用的,因爲您必須爲該特定類別編碼

public static IList<Employee> GetEmployees(DataTable table) 
{ 
    var employees = new List<Employee>(); 
    if (table != null) { 
     foreach (DataRow row in table.Rows) { 
      var emp = new Employee(); 
      emp.ID = (int)row["ID"]; 
      emp.Name = (string)row["Name"]; 
      emp.Salary = (decimal)row["Salary"]; 
      employees.Add(emp); 
     } 
    } 
    return employees; 
} 

此代碼必須針對不同的表而不同,並且不能是通用的。至少不是沒有使用Reflection並假定這些屬性具有與表列相同的名稱。


一個解決方案不使用一些棘手的Reflection代碼或其他魔術將是這樣定義

public interface IDataObject 
{ 
    void FillFromRow(DataRow row); 
} 

然後聲明Employee或接口的任何其它數據類這樣

public class Employee : IDataObject 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public decimal Salary { get; set; } 

    public void FillFromRow(DataRow row) 
    { 
     ID = (int)row["ID"]; 
     Name = (string)row["Name"]; 
     Salary = (decimal)row["Salary"]; 
    } 
} 

現在您可以再次使用仿製藥

public static IList<T> GetItems<T>(DataTable table) 
    where T : IDataObject, new() 
{ 
    var items = new List<T>(); 
    if (table != null) { 
     foreach (DataRow row in table.Rows) { 
      T item = new T(); 
      item.FillFromRow(row); 
      items.Add(item); 
     } 
    } 
    return items; 
} 
+0

@Oliver如果我想將數據錶轉換爲IList ,你能告訴我一個如何使用該函數的示例嗎? – 2012-03-16 18:54:34

+0

@Oliver這是我如何編碼它,但別人說(十進制)行[「薪水」]; 如果認爲是「不好」的編碼習慣。你怎麼看? – 2012-03-16 19:10:01

+0

誰說這是不好的編碼習慣?請給一個參考。 – Hogan 2012-03-16 19:19:49