C# 如何通过Activator实例化对象。CreateInstance使用Dapper将对象插入表中

C# 如何通过Activator实例化对象。CreateInstance使用Dapper将对象插入表中,c#,.net,dapper,C#,.net,Dapper,我试图使用Dapper.Contrib.Extensions库在数据库中插入“ClassName”类的实例,我使用的是.NET Framework 4.6.1的Activator.CreateInstance方法,因为我只有纯文本形式的类名,所以无法实例化直接调用该类的对象 强制转换类名的工作方式与预期相同。Insert((ClassName)instance);但我不能使用这种方式,因为“ClassName”只是从XML文件中获取的文本 private void InsertByDapp

我试图使用Dapper.Contrib.Extensions库在数据库中插入“ClassName”类的实例,我使用的是.NET Framework 4.6.1的Activator.CreateInstance方法,因为我只有纯文本形式的类名,所以无法实例化直接调用该类的对象

强制转换类名的工作方式与预期相同。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:“附近语法不正确”。”

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


SQL错误:插入到对象()值();选择SCOPE_IDENTITY()id

我猜您正在使用一个通用方法,该方法采用通用参数TEntity或类似参数。因为您为它提供了类型object,所以它将使用它。您可能应该使用一种非泛型的方法

编辑:是的,我猜是对的

有趣的是,这个方法没有泛型重载。您可以使用反射来调用具有正确泛型参数的泛型方法

例如,请确保缓存来自
MakeGenericMethod
的结果,因为这很昂贵

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

它看起来真的很好,你知道为什么失败了,我就是不能使用这个解决方案,因为我得到了一个“参数计数不匹配”。错误,我将尝试解决方法。你也需要提供默认参数