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;
我想在运行时从 sqldatareader 对象设置特定属性的值。 但是我得到了一个目标类型不匹配的异常,即使两个引用都是相同的类型
最佳答案
这里有两个问题。最主要的是您错误地调用了 SetValue()
。
来自 MSDN :
public void SetValue(object obj, object value)
所以实际上您是在使用错误放置的参数调用该方法。这样做应该没问题:
p[i].SetValue(t, dataReader[i]);
您将遇到的第二个问题是,最后您的列表将仅包含相同的对象,因为您只创建了一个新对象一次 (T t = new T();
。要解决它,您必须将此行放在 while
循环中。
此外,use using为了更清晰的代码,因为你应该在最后处理你的命令......并关闭你的连接。
总而言之,这是最终代码:
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;
关于c# - 无法将属性值设置为 sqldatareader 类型的目标类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46702180/