DataRow字段从变量转换

时间:2014-02-13 15:35:16

标签: c# .net datatable

是否可以从变量中转换类型?我正在将电子表格中的数据提取到类中,但由于某些列是字符串,而其他列是DateTime,我真的想要一个do-all命令,我不需要手动映射所有内容。

到目前为止我所拥有的:

foreach (PropertyInfo pinfo in asset.GetType().GetProperties())
{
    string columnType = (from DataColumn column in data.Columns where column.ColumnName == pinfo.Name select column).First().DataType.ToString();
    pinfo.SetValue(asset, row.Field<columnType>(pinfo.Name));
}

目前,它不喜欢row.Field<columnType>(),因为它不是真正的类型。

是否可以执行上述操作,我将获取列中包含的类型,并将其转换为检索该列的数据?我正处于这种情况,因为我想使用以下语句检索任何内容,无论它是字符串,int还是DateTime。

var foo = row.Field<string>("Column Name");

我可以使用任何通用命令吗?感谢

1 个答案:

答案 0 :(得分:2)

PropertyInfo.SetValue接受值作为对象。如果您的DataTable具有适当类型的列,那么只需获取带有row[columnName]的列值,该值也将作为对象返回,并使用它来设置属性值:

foreach (PropertyInfo pinfo in asset.GetType().GetProperties())
{
     pinfo.SetValue(asset, row[pinfo.Name]);
}

示例:考虑你有课

public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
}

你有DataTable,它有适当类型的列:

DataTable dt = new DataTable();
dt.Columns.Add("Id", typeof(int));
dt.Columns.Add("Name", typeof(string));
dt.Rows.Add(1, "Bob");
dt.Rows.Add(2, "John");

然后从DataTable填充用户将如下所示:

var user = new User();
var row = dt.Rows[0];

foreach (PropertyInfo pinfo in user.GetType().GetProperties())
    pinfo.SetValue(user, row[pinfo.Name]);

注意:您可以跳过没有适当类型的属性,也可以在没有具有属性名称的列时处理大小写:

foreach (PropertyInfo pinfo in user.GetType().GetProperties())
{
    if (!dt.Columns.Contains(pinfo.Name) || 
         dt.Columns[pinfo.Name].DataType != pinfo.PropertyType)
        continue;

    pinfo.SetValue(user, row[pinfo.Name]);
}