使用Reflection编写ORM无法正确编译

Jor*_*dan 1 c# reflection orm

所以我写的是严格用于个人学习的C#中的ORM.我循环遍历数据库,其中列名称与类的属性匹配.然后我循环遍历类的属性并分配相应的数据库列值,但我遇到了从数据库列转换返回值的问题.

var PropCollection = type.GetProperties();
foreach (PropertyInfo Property in PropCollection)
{
    Property.SetValue(_t, DReader[Property.Name].ToString(),null);
}
Run Code Online (Sandbox Code Playgroud)

我得到了预期的错误:

"System.String"类型的对象无法转换为"System.Int32"类型.

其中DReader只是一个返回循环内部列值的SQLDataReader,假设这个值是一个int,我该怎么把它这样抛出?

Property.GetType();
Run Code Online (Sandbox Code Playgroud)

正确地知道我需要的类型,但我如何使用它来投射DReader[Property.Name]

jga*_*fin 5

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);
}
Run Code Online (Sandbox Code Playgroud)