Как создать экземпляр объекта посредством Activator.CreateInstance и вставить его в таблицу с помощью Dapper - PullRequest
4 голосов
/ 28 марта 2019

Я пытаюсь вставить экземпляр класса "ClassName" в базу данных с помощью библиотеки Dapper.Contrib.Extensions, я использую Activator.CreateInstance метод .NET Framework 4.6.1, потому что У меня просто есть Имя класса в текстовом виде, поэтому я не могу создать экземпляр объекта, вызывающего непосредственно класс.

Приведение класса ClassName работает как положено connTo.Insert ((ClassName) instance); но я не могу использовать этот способ, потому что "ClassName" - это просто текст, который я получаю из файла XML.

   private void InsertByDapper(string className, SqlConnection conn)
    {
        Type type = Type.GetType(className);
        if (type != null)
        {
            var instance = Activator.CreateInstance(type);

            // ... update some properties in the instance object...

            conn.Insert(instance);

            //connTo.Insert((ClassName)instance); //This statment works
        }
    }

Исключение, создаваемое в .NET: System.Data.SqlClient.SqlException: 'Неверный синтаксис рядом с') '.'

Объяснение ошибки: Даппер пытается вставить объект в таблицу объектов. Моя цель - вставить его в таблицу className.

Ошибка SQL: вставить в Objects () значения (), выбрать SCOPE_IDENTITY () id

1 Ответ

2 голосов
/ 28 марта 2019

Я предполагаю, что вы используете универсальный метод, который принимает универсальный аргумент TEntity или аналогичный.Так как вы предоставляете его типом объекта, он будет использовать его.Вероятно, нет ни одного универсального метода, который вы должны использовать.

edit: Yepp, мое предположение было верным.метода.Вы можете использовать рефлексию для вызова универсального метода с правильным универсальным аргументом

Пример. Убедитесь, что вы кэшируете результат из MakeGenericMethod, его дорогой

typeof(SqlMapperExtensions).GetMethod(nameof(SqlMapperExtensions.Insert)).MakeGenericMethod(instance.GetType()).Invoke(null, new object[] { conn,  instance, null, null});
...