首先,您要退回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;
}
這是一個_compiler error_,而不是一個例外。 – SLaks 2012-03-16 18:39:13
你讀過這條消息嗎?你期望那條線做什麼? – SLaks 2012-03-16 18:39:27
你可以用'table.AsEnumerable()來替換整個函數。ToList()' – SLaks 2012-03-16 18:40:03