如何在c#4,0 </t>中的列表<t>中添加类型

时间:2010-08-22 10:03:12

标签: c# list properties

我试图动态地从数据库中获取数据。我有list<T> select<T>()方法...继续我的问题我可以通过使用datareader得到数据这里是代码:

public list<T> Select<T>()
{
    Type type = typeof(T);
    ...
    ...
    using (SqlConnection connection = new SqlConnection(ConnectionString))
    {
        try
        {
                SqlCommand sqlCommand = new SqlCommand(selectCommand, connection);
                connection.Open();
                SqlDataReader sqlReader = sqlCommand.ExecuteReader();
                while (sqlReader.Read())
                {
                    foreach (PropertyInfo property in type.GetProperties())
                    {
                        property.SetValue( property.Name,(PropertyInfo)sqlReader[property.Name],null);

                    }
                    typeList.Add((T)Convert.ChangeType(type,typeof(T)));
                }
                sqlReader.Close();
        }
        catch (Exception ex)
        {
                string exc = ex.Message;
        }
        finally
        { 
                connection.Close();
        }
    }
    return typeList;
}

我可以获取数据,但我无法将其分配给我的类型,所以我无法将我的类型添加到我的类型列表中,可以帮助我

3 个答案:

答案 0 :(得分:1)

在能够将属性分配给类型之前,您需要实例化它:

T instance = Activator.CreateInstance<T>();
foreach (PropertyInfo property in type.GetProperties())
{
    property.SetValue(instance, sqlReader[property.Name], null);
}
typeList.Add(instance);

还要将SqlCommand包裹在using块中,以便妥善处理它。另一个注意事项是,您不需要在finally块中.Close()建立连接,这将由Dispose方法自动完成,因为您已将连接包装在using中块。

答案 1 :(得分:1)

看起来您想为每个数据库行创建一个T类型的对象。

然后你可以将你的泛型约束到具有空构造函数的类:

public List<T> Select<T>() where T : new()

然后你可以创建新的T

while (sqlReader.Read())
{
    T item = new T();
    foreach (PropertyInfo property in type.GetProperties())
    {
        // Note the first parameter "item"
        property.SetValue(item, sqlReader[property.Name], null);
    }
    typeList.Add(item);
}

答案 2 :(得分:0)

您要在此处转换哪些数据类型?您可能应该根据查询选择数据,这看起来就像您尝试将整个数据库存储在一个随机提供的类型中。您可能正试图将文本存储在双...

如果您只想存储数据库中的所有数据,请使用DataSet或DataTable。

你还在这做什么?

property.SetValue( property.Name,(PropertyInfo)sqlReader[property.Name],null);

看起来您正在尝试更改所请求类型的属性名称...