使用反射编写ORM无法正确地进行强制转换
本文关键字:正确地 转换 反射 ORM | 更新日期: 2023-09-27 18:20:50
所以我在C#中写一个ORM,严格来说是为了个人学习。我在数据库中循环,其中的列名与类的属性相匹配。然后,我循环遍历类的属性并分配相应的数据库列值,但在从数据库列转换返回值时遇到了问题。
var PropCollection = type.GetProperties();
foreach (PropertyInfo Property in PropCollection)
{
Property.SetValue(_t, DReader[Property.Name].ToString(),null);
}
我得到预期的错误:
"System.String"类型的对象无法转换为类型"System.Int32".
如果DReader只是一个SQLDataReader,在循环中返回一个列值,假设这个值是int,我该如何将其强制转换为这样的值??
Property.GetType();
正确地知道我需要的类型,但我如何使用它来强制转换DReader[Property.Name]
?
Convert.ChangeType
可以处理所有的直接转换。
您不应该在循环中使用DReader[Property.Name].ToString()
。卸下ToString()
。
var PropCollection = type.GetProperties();
foreach (PropertyInfo Property in PropCollection)
{
var value = DReader[Property.Name];
if (!Property.GetType().IsAssignableFrom(value.GetType())
value = Convert.ChangeType(value, Property.GetType());
Property.SetValue(_t, value, null);
}