c# - 无法将属性值设置为 sqldatareader 类型的目标类型

标签 c#

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/

相关文章:

c# - FakeItEasy 找不到电话,尽管它在那里

c# - 条件格式隐藏文本

c# - WPF:组合框在绑定(bind) ItemSsource 集合更改后丢失 selectedindex

c# - "NotSupported"属性?

javascript - 需要在Datalist中实现javascript验证

c# - 测试验证 C#

c# - 尝试关闭事件的 TCP 连接,但出现错误

c# - 无法安装 Entity Framework Power Tools

c# - WCF 已超出传入消息的最大消息大小配额 (65536)

c# - 如何将主题应用到 Extended WPF Toolkit?