gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 12:19:48 26 4
gpt4 key购买 nike

我正在尝试使用 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:'')' 附近的语法不正确。'

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

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

最佳答案

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

编辑:是的,我猜对了。

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

关于c# - 如何通过 Activator.CreateInstance 实例化对象并使用 Dapper 将其插入到表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55398454/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com