是否可以从变量中转换类型?我正在将电子表格中的数据提取到类中,但由于某些列是字符串,而其他列是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");
我可以使用任何通用命令吗?感谢
答案 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]);
}