как добавить тип в список <T>в c # 4,0 - PullRequest
1 голос
/ 22 августа 2010

Я пытаюсь получить данные из базы данных динамически.у меня есть 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 ]

1 голос
/ 22 августа 2010

Прежде чем вы сможете назначить свойства типу, вам нужно создать его экземпляр:

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

Также оберните ваш SqlCommand в блок using, чтобы правильно его расположить.Еще одно замечание: вам не нужно .Close() ваше соединение в блоке finally, это будет автоматически выполнено методом Dispose, поскольку вы уже завернули соединение в блок using.

1 голос
/ 22 августа 2010

Похоже, что вы хотите создать объект типа T для каждой строки базы данных.

Тогда вы можете ограничить свой универсальный класс классами с пустыми конструкторами:

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

, тогда вы можетесоздать новые T's

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);
}
0 голосов
/ 22 августа 2010

Какие типы данных вы пытаетесь преобразовать здесь? Вероятно, вам следует выбирать данные на основе запросов, похоже, что вы пытаетесь сохранить всю базу данных в одном случайно предоставленном типе. Возможно, вы пытаетесь сохранить текст в двойном формате ...

Если вы просто хотите сохранить все данные из базы данных, используйте DataSet или DataTable.

И что ты здесь делаешь?

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

Похоже, вы пытаетесь изменить имена свойств запрашиваемого типа ...

...