2009-12-06 2 views
0

При выполнении этого метода:DataTable к списку <T> проблемы перекодировки

public static List<T> ToList<T>(DataTable dataTable) 
     { 
      Type type = typeof(T); 

      List<T> list = new List<T>(); 

      foreach (DataRow dr in dataTable.Rows) 
      { 
       object[] args = new object[1]; 

       args[0] = dr; 

       list.Add((T)Activator.CreateInstance(type, args)); 
      } 

      return list; 
     } 

Я получаю это исключение:

Constructor on type 'Northwind.BO.Products' not found. 

Но я знаю, что я уже объявлен конструктор в моем Products классе.

public class Products 
{ 
    private int _ProductID; 
    [DataMapping("ProductID", -99)] 
    public int ProductID 
    { 
     get { return _ProductID; } 
     set 
     { 
      if (_ProductID <= 0) 
      { 
       _ProductID = value; 
      } 
      else 
      { 
       throw new Exception("ID should not be set manually!"); 
      } 
     } 
    } 

    private string _ProductName; 
    [DataMapping("ProductName", "")] 
    public string ProductName 
    { 
     get { return _ProductName; } 
     set { _ProductName = value;} 
    } 

    private int _SupplierID; 
    [DataMapping("SupplierID", -99)] 
    public int SupplierID 
    { 
     get { return _SupplierID; } 
     set { _SupplierID = value;} 
    } 

    private int _CategoryID; 
    [DataMapping("CategoryID", -99)] 
    public int CategoryID 
    { 
     get { return _CategoryID; } 
     set { _CategoryID = value;} 
    } 

    private string _QuantityPerUnit; 
    [DataMapping("QuantityPerUnit", "")] 
    public string QuantityPerUnit 
    { 
     get { return _QuantityPerUnit; } 
     set { _QuantityPerUnit = value;} 
    } 

    private decimal _UnitPrice; 
    [DataMapping("UnitPrice", -99.99)] 
    public decimal UnitPrice 
    { 
     get { return _UnitPrice; } 
     set { _UnitPrice = value;} 
    } 

    private short _UnitsInStock; 
    [DataMapping("UnitsInStock", -99)] 
    public short UnitsInStock 
    { 
     get { return _UnitsInStock; } 
     set { _UnitsInStock = value;} 
    } 

    private short _UnitsOnOrder; 
    [DataMapping("UnitsOnOrder", -99)] 
    public short UnitsOnOrder 
    { 
     get { return _UnitsOnOrder; } 
     set { _UnitsOnOrder = value;} 
    } 

    private short _ReorderLevel; 
    [DataMapping("ReorderLevel", -99)] 
    public short ReorderLevel 
    { 
     get { return _ReorderLevel; } 
     set { _ReorderLevel = value;} 
    } 

    private bool _Discontinued; 
    [DataMapping("Discontinued", false)] 
    public bool Discontinued 
    { 
     get { return _Discontinued; } 
     set { _Discontinued = value;} 
    } 

public Products(object[] args) 
{ 
} 

public Products() 
{ 
} 
+1

Как выглядит конструктор 'Northwind.BO.Products'? Конструктор должен соответствовать найденным «args». – dtb

ответ

1

Вам не нужен конструктор по любому Northwind класса - в соответствии с исключением, вам нужен конструктор правильно на Northwind.BO.Products.

Кроме того, как используется Activator.CreateInstance, этот конструктор должен иметь правильную подпись, которая соответствует аргументу, который вы передаете ему. Поскольку вы передаете ему аргумент, конструктор по умолчанию не будет соответствовать.

Как я прочитал ваш вопрос, он должен иметь этот конструктор

public Products(DataRow dr) 
+0

Массив объектов является частью вызова CreateInstance; CreateInstance попытается найти конструктор, который соответствует содержимому, поэтому массив лучше всего. http://msdn.microsoft.com/en-us/library/wcxyzt4d.aspx – dtb

+0

Это тоже не работает. public Products (object [] args) {} – anonymous

+0

@dtb: Вы правы - моя вина. Отредактировал мой ответ. –

2

Проблема заключается в том, что Northwind.BO.Products класс не имеет public конструктор, который принимает один DataRow.

Можете ли вы рассказать нам, какие конструкторы у него есть?

+0

public Products() {} – anonymous

+0

Тогда вы можете писать «Activator.CreateInstance (type)» без каких-либо параметров. – SLaks

0

Наиболее вероятно, что указатель конструктора не соответствует аргументу, который вы поставляете.