繁体   English   中英

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

[英]How to instanciate an object by Activator.CreateInstance an inserting it on a table using Dapper

我正在尝试使用Dapper.Contrib.Extensions库在数据库中插入“ClassName”类的实例,我正在使用.NET Framework 4.6.1的Activator.CreateInstance方法,因为我只是在文本中具有类名称所以我无法实现一个直接调用该类的对象。

转换ClassName按预期工作 但我无法使用这种方式,因为“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:''附近的语法不正确')'。'

错误说明:Dapper正在尝试将对象插入Objects表中。 我的目的是将它插入className表。

SQL错误:插入Objects()values();选择SCOPE_IDENTITY()id

我猜你正在使用泛型参数TEntity或类似的泛型方法。 由于您为它提供了类型对象,因此它将使用它。 您可能应该使用非通用方法。

编辑:Yepp,我的猜测是对的。

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});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM