很难将<t>类型添加到列表中

时间:2015-09-21 01:22:44

标签: c# mysql list generics

我需要帮助我的代码,因为我似乎无法找到为什么多次将类型<T>添加到列表中会覆盖正在添加的其他值的罪魁祸首。

以下是我的代码:

public IEnumerable<T> Query<T>(string query, object parameters = null) where T : new()
{
    var lists = new List<T>();
    var ObjType = new T();
    var ObjProps = ObjType.GetType().GetProperties();
    int Objlen = ObjProps.Length;

    if (parameters == null)
    {
        DBConnection.Open();
        using (MySqlTransaction mysqlTransaction = DBConnection.BeginTransaction(System.Data.IsolationLevel.ReadCommitted))
        {
            try
            {
                using (MySqlCommand command = new MySqlCommand(query, DBConnection))
                {
                    command.Transaction = mysqlTransaction;
                    using (MySqlDataReader dataReader = command.ExecuteReader())
                    {
                        if (dataReader.HasRows)
                        {
                            while (dataReader.Read())
                            {
                                for (int i = 0; i < dataReader.FieldCount; i++)
                                {
                                    var dataValue = dataReader.GetValue(i);
                                    ObjProps.FirstOrDefault(p => p.Name == dataReader.GetName(i)).SetValue(ObjType, dataValue);
                                }
                                lists.Add(ObjType);
                            }
                        }
                    }
                }
            }
            catch (Exception)
            {
                mysqlTransaction.Rollback();
                DBConnection.Close();
                throw;
            }
            finally
            {
                if (DBConnection != null)
                {
                    DBConnection.Close();
                }
            }
        }
    }
    return lists;
}

我似乎无法在代码中找到逻辑错误。当我执行代码时,第一个添加到列表是可以的。

First Lists Add

但是一旦它再次迭代for for循环,这些值似乎被覆盖了,我甚至不知道为什么会发生这种情况。

下面是图片:

enter image description here

非常感谢任何帮助/澄清/答案。

3 个答案:

答案 0 :(得分:3)

您收到错误是因为您始终设置同一实例的属性并将相同的实例添加到列表中。

ObjType = new T();循环之前添加for

答案 1 :(得分:3)

var ObjType = new T();应位于while循环内,而不是顶部。否则,您只是修改同一个对象而不是添加新对象。

答案 2 :(得分:3)

您没有在for循环中创建新的<T>(ObjType)。如果您这样做,请不要忘记重置ObjProps以引用新的ObjType