C# 如何通过Activator实例化对象。CreateInstance使用Dapper将对象插入表中
我试图使用Dapper.Contrib.Extensions库在数据库中插入“ClassName”类的实例,我使用的是.NET Framework 4.6.1的Activator.CreateInstance方法,因为我只有纯文本形式的类名,所以无法实例化直接调用该类的对象 强制转换类名的工作方式与预期相同。Insert((ClassName)instance);但我不能使用这种方式,因为“ClassName”只是从XML文件中获取的文本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
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});
它看起来真的很好,你知道为什么失败了,我就是不能使用这个解决方案,因为我得到了一个“参数计数不匹配”。错误,我将尝试解决方法。你也需要提供默认参数