PropertyInfo.SetValue无法将字符串转换为十进制数。

6
我有一个数据表,其中包含不同数据类型的列(主要是int64和字符串)。 我正在尝试将此数据表转换为对象列表。 为此,我使用以下方法:
public static List<T> ConvertDataTable<T>(DataTable dt)
{
 List<T> data = new List<T>();
 foreach (DataRow row in dt.Rows)
 {
  T item = GetItem<T>(row);
  data.Add(item);
 }
 return data;
}

当试图将类型为string的datacolumn值转换为类型为Decimal的类属性时,下面的GetItem()方法(更精确地说是pro.SetValue())会引发异常("类型为'System.String'的对象无法转换为类型'System.Decimal'")。
private static T GetItem<T>(DataRow dr)
{
 Type temp = typeof(T);
 T obj = Activator.CreateInstance<T>();
 foreach (DataColumn column in dr.Table.Columns)
 {
  foreach (PropertyInfo pro in temp.GetProperties())
  {
   if (pro.Name == column.ColumnName)
    pro.SetValue(obj, dr[column.ColumnName], null);
    else
     continue;
  }
 }
return obj;
}

这里是 MyClass,它什么都不是。
public class AgriSales
{
 public Int64 Id { get; set; }
 public string Type { get; set; }
 public Decimal Cost    { get; set; }
}

有人能指导我克服我面临的障碍吗?

1
你需要告诉我们抛出了什么异常。 - Richard
根据你的建议,我更新了我的帖子。它抛出了一个ArgumentException,指出“System.String”类型的对象无法转换为“System.Decimal”类型。 - Shekar.gvr
1个回答

8
使用 Convert.ChangeType() 可以帮助你解决问题。然而,对于更复杂的类型,你可能需要实现相同的保障措施。
pro.SetValue(obj, Convert.ChangeType(dr[column.ColumnName], pro.PropertyType), null);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接