如何通过 Activator.CreateInstance 实例化一个对象并使用 Dapper 将其插入到表中

4

我正在尝试使用Dapper.Contrib.Extensions库将“ClassName”类的实例插入到数据库中,由于我只有纯文本的类名,因此我使用.NET Framework 4.6.1的Activator.CreateInstance方法来创建对象。

强制转换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: 'Incorrect syntax near ')'.'

错误的解释:Dapper试图将对象插入到Objects表中,但我的目的是将其插入到className表中。

SQL错误:insert into Objects () values ();select SCOPE_IDENTITY() id

1个回答

2
我猜测您正在使用一个通用的方法,该方法接受通用参数TEntity或类似参数。由于您提供它的类型为object,因此它将使用该类型。可能应该使用一个非通用方法。

编辑:是的,我的猜测是正确的。

https://github.com/StackExchange/Dapper/blob/master/Dapper.Contrib/SqlMapperExtensions.cs#L332

有趣的是该方法没有非通用重载。您可以使用反射调用具有正确通用参数的通用方法。

例如,请确保缓存MakeGenericMethod的结果,这很昂贵。

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

看起来非常不错,你找到了为什么会失败的原因,但我无法使用这个解决方案,因为我遇到了“参数计数不匹配”的错误。我将尝试一个变通方法。 - jMiguel LA
1
你也需要提供默认参数。 - Anders

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接