C# 无法将属性值从sqldatareader类型设置为目标类型 List returnList=newlist(); conn.Open(); SqlCommand sCmd=新的SqlCommand(查询,连接); SqlDataReader=sCmd.ExecuteReader(); T=新的T(); PropertyInfo[]p=o.GetType().GetProperties(); while(dataReader.Read()) { 对于(int i=0;i

C# 无法将属性值从sqldatareader类型设置为目标类型 List returnList=newlist(); conn.Open(); SqlCommand sCmd=新的SqlCommand(查询,连接); SqlDataReader=sCmd.ExecuteReader(); T=新的T(); PropertyInfo[]p=o.GetType().GetProperties(); while(dataReader.Read()) { 对于(int i=0;i,c#,C#,我想在运行时从sqldatareader对象设置特定属性的值。 但是我得到了一个目标类型不匹配的例外,即使两个引用的类型相同。主要原因是您对SetValue()的调用错误 发件人: 公共无效设置值(对象对象,对象值) 因此,实际上您是在使用错误的参数调用该方法。这样做应该没问题: List<T> returnList = new List<T>(); conn.Open(); SqlCommand sCmd = new SqlCommand(query, conn); S

我想在运行时从sqldatareader对象设置特定属性的值。
但是我得到了一个目标类型不匹配的例外,即使两个引用的类型相同。主要原因是您对
SetValue()
的调用错误

发件人:

公共无效设置值(对象对象,对象值)

因此,实际上您是在使用错误的参数调用该方法。这样做应该没问题:

List<T> returnList = new List<T>();
conn.Open();
SqlCommand sCmd = new SqlCommand(query, conn);
SqlDataReader dataReader = sCmd.ExecuteReader();
T t = new T();
PropertyInfo[] p = o.GetType().GetProperties();
while(dataReader.Read())
{
    for (int i = 0; i < p.Length; i++)
    {
        Console.WriteLine(p[i].GetValue(t)+" "+p[i].PropertyType+" 
        "+dataReader[i].GetType());
        p[i].SetValue(dataReader[i], t);
    }
    returnList.Add(t);
}
return returnList;
您将遇到的第二个问题是,在列表的末尾,您的列表将只包含相同的对象,因为您只创建了一次新对象(
T=new T();
)。要解决它,您必须将此行放在
while
循环中

另外,为了更干净的代码,因为您应该在最后处理您的命令…并关闭您的连接

总而言之,这是最终代码:

p[i].SetValue(t, dataReader[i]);
List returnList=newlist();
conn.Open();
使用(SqlCommand-sCmd=newsqlcommand(查询,连接))
{
SqlDataReader=sCmd.ExecuteReader();
PropertyInfo[]p=o.GetType().GetProperties();
while(dataReader.Read())
{
T=新的T();
对于(int i=0;i
在哪一行出现此异常?您如何知道datareader中的列的顺序与属性的顺序相同?我设置值并编写类的那一行我的列在表中的顺序您可以在代码中添加方法签名吗?(公共/私人列表myMethodName…)谢谢helped@SohelAhmed如果这回答了您的问题,请将其标记为答案(答案顶部旁边的复选标记)。这样其他人将看到此问题已得到回答。
List<T> returnList = new List<T>();
conn.Open();
using (SqlCommand sCmd = new SqlCommand(query, conn))
{
    SqlDataReader dataReader = sCmd.ExecuteReader();
    PropertyInfo[] p = o.GetType().GetProperties();
    while(dataReader.Read())
    {
        T t = new T();
        for (int i = 0; i < p.Length; i++)
        {
            Console.WriteLine(p[i].GetValue(t)+" "+p[i].PropertyType+" "+dataReader[i].GetType());
            p[i].SetValue(t, dataReader[i]);
        }
        returnList.Add(t);
    }
}
conn.Close();
return returnList;