0

我正在尝试编写一个可以采用三个参数的函数:SqlDataReader、DataGridView 和 List。

我想获取 SqlDataReader 的内容并创建一个对象列表,然后将其绑定到 DataGridView。

借助另一个 Stack Overflow 用户的一些建议,我得出以下结论:

public void FillArrayList<T>(DataGridView grid, SqlDataReader reader, List<T> list)
{
    //Fill the list with the contents of the reader
    while (reader.Read())
    {
        Object obj = new Object();
        Type type = typeof(T);

        FieldInfo[] fields = type.GetFields(); // Get the fields of the assembly
        int i = 0;

        foreach(var field in fields)
        {
            field.SetValue(obj, reader[i]); // set the fields of T to the reader's value
            i++;
        }

        list.Add((T)obj);
    }

    grid.DataSource = list;
}

当我运行代码时,将对象转换为类型 T 时出现错误:

无法将“System.Object”类型的对象转换为“TestHarness.Organisation”类型。

我的印象是 Object 可以存储任何东西。谁能告诉我为什么这个演员不能表演?

谢谢,

安迪

4

2 回答 2

2

您几乎可以将任何东西投射到 Object 上,但不能将 Object 投射到任何东西上。看看 MSDN 上的System.Object类。注意那里几乎什么都没有。演员表没有意义,因为它在功能上与调用新的 TestHarness.Organization 相同。

如果您确切地知道要在 DataReader 中寻找什么以进入 TestHarness.Organization 或其他任何内容,则可以尝试用户定义的转换。这将允许您隐式或显式调用一些代码来为您进行类型更改,而无需任何额外的代码。

于 2012-06-11T19:30:24.610 回答
0

在 MMK 发布的链接的帮助下,在我的问题下方的评论中,我设计了一个解决方案:

public void FillList<T>(DataGridView grid, string SQLCommand, List<T> list) where T : class, new()
    {
        //Load the data into the SqlDataReader
        SqlCommand dataCommand = new SqlCommand();
        dataCommand.Connection = dataConnection;
        dataCommand.CommandType = CommandType.Text;
        dataCommand.CommandText = SQLCommand;

        SqlDataReader dataReader = dataCommand.ExecuteReader();

        //Fill the list with the contents of the reader
        while (dataReader.Read())
        {
            var obj = new T();

            //Get the property information
            PropertyInfo[] properties = typeof(T).GetProperties();
            int i = 0;

            foreach(var property in properties)
            {
                property.SetValue((T)obj, dataReader[i], null); // set the fields of T to the reader's value
                i++;
            }

            list.Add(obj);
        }

        dataReader.Close();

        //Bind the list to the DataGridView
        grid.DataSource = list;
    }

似乎正是我需要的。当我在越来越多的情况下使用它时,我可能会遇到一些明显的错误,但是,这就是生活。

谢谢你们的帮助,伙计们!

于 2012-06-22T18:57:32.520 回答