Конвертация строки в тип определенный классом Type

Я хочу добавлять в базу данных определенный объект(названия полей этого объекта совпадают с названиями в таблице базы данных). для этого сделал метод ниже:

public void InsertData<T>(T newItem, string dataTable)
        where T : IInfo
    {
        string[] data = newItem.Info;

        var propertysInfo = GetPropertyInfos(newItem);

        StringBuilder firstPartOfCommand = new StringBuilder();
        StringBuilder secondPartOfCommand = new StringBuilder();

        foreach (var propertyName in propertysInfo.Select(prop => prop.Name))
        {
            firstPartOfCommand.Append(propertyName + ",");
            secondPartOfCommand.AppendFormat("@{0},", propertyName);
        }

        firstPartOfCommand.Remove(firstPartOfCommand.Length - 1, 1);
        secondPartOfCommand.Remove(firstPartOfCommand.Length - 1, 1);

        SqlCommand command = new SqlCommand($"INSERT INTO {dataTable} ({firstPartOfCommand}) VALUES ({secondPartOfCommand})", _connection);

        int indexOfData = 0;
        foreach (var property in propertysInfo)
        {
            object tempDatum = Convert.ChangeType(data[indexOfData++], property.PropertyType);
            command.Parameters.AddWithValue(property.Name, tempDatum);
        }

        command.ExecuteNonQuery();
    }

в теории, он должен получать объект и название таблицы, создавать sql команду исходя из свойств объекта, после этого записывать его в базу данных, приводя строку к типу поля используя

Convert.ChangeType(data[indexOfData++], property.PropertyType);

но проблема в том, что таким образом у меня не переводится TimeSpan с ошибкой: Недопустимое приведение "System.String" к "System.TimeSpan".

А также bool хоть и переводится на моменте "экзекуции" выдает ошибку.

Конечно можно написать кучу ифов и переводить с помощью parce но мне кажется, что есть более элегантное решение.

update Вспомнил, что в строке с временем TimeSpan у меня немного обрезанное время (без секунд), возможно исправив это первой ошибки не будет, но все же остается вторая.


Ответы (0 шт):