C# 使用反射编写ORM无法正确强制转换
所以我在写一篇C#中的ORM,完全是为了个人学习。我在一个数据库中循环,其中的列名与类的属性匹配。然后,我循环遍历类的属性并分配相应的数据库列值,但是我遇到了从数据库列转换返回值的问题C# 使用反射编写ORM无法正确强制转换,c#,reflection,orm,C#,Reflection,Orm,所以我在写一篇C#中的ORM,完全是为了个人学习。我在一个数据库中循环,其中的列名与类的属性匹配。然后,我循环遍历类的属性并分配相应的数据库列值,但是我遇到了从数据库列转换返回值的问题 var PropCollection = type.GetProperties(); foreach (PropertyInfo Property in PropCollection) { Property.SetValue(_t, DReader[Property.Name].ToString(),nu
var PropCollection = type.GetProperties();
foreach (PropertyInfo Property in PropCollection)
{
Property.SetValue(_t, DReader[Property.Name].ToString(),null);
}
我得到了预期的错误:
无法将类型为“System.String”的对象转换为类型
'System.Int32'
如果DReader只是一个SQLDataReader,在循环中返回一个列值,如果这个值是一个int,我如何将其转换为int
Property.GetType();
正确地知道我需要的类型,但如何使用该类型来投射
DReader[Property.Name]
Convert.ChangeType
可以处理所有直接转换
您不应该在循环中使用DReader[Property.Name].ToString()
。卸下ToString()
Convert.ChangeType
可以处理所有直接转换
您不应该在循环中使用DReader[Property.Name].ToString()
。卸下ToString()
根据您的ORM的“规则”是什么,您可以只删除
.ToString()
-但是:由于您使用的是SetValue
,您实际上不需要强制转换…?根据您的ORM的“规则”是什么,您可以只删除.ToString()
-但是:既然您使用的是SetValue
,您就不需要强制转换…?谢谢,我的C#词汇表中完全没有Convert!谢谢,不知怎的,我的C#词汇表中完全没有Convert!
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);
}