Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用反射编写ORM无法正确强制转换_C#_Reflection_Orm - Fatal编程技术网

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

所以我在写一篇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,我如何将其转换为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);
}