Dapper 默认不支持私有构造函数映射,但可通过 [Dapper.Constructor] 特性(推荐,需 v2.0+)或 Query(sql, map: ...) 手动构造实现;参数名须与 SQL 字段名严格匹配,或通过委托显式调用私有构造函数。

Dapper 默认不支持直接映射到具有私有构造函数的类,因为它依赖于反射创建实例,而私有构造函数在没有显式指定时通常不会被调用(尤其当存在公有无参构造函数时)。但你可以通过几种方式让 Dapper 正确映射到私有构造函数的类。
Dapper 从 v2.0 开始支持 [Dapper.Constructor] 特性,用于标记你希望 Dapper 在构造对象时调用的构造函数。只要该构造函数参数名与查询字段名(或别名)匹配,Dapper 就能自动绑定并调用它。
Dapper 2.1.24 或更高)[Dapper.Constructor]
public class User
{
public int Id { get; }
public string Name { get; }
[Dapper.Constructor]
private User(int id, string name)
{
Id = id;
Name = name;
}
}
// 查询必须返回对应字段名(或别名)
var users = connection.Query<User>("SELECT Id, Name FROM Users");
如果你无法修改类(比如是第三方类型),或想完全控制映射逻辑,可以用 Dapper 的 map 参数手动构造对象。
Func<idatareader object t></idatareader> 显式读取字段并调用私有构造函数var users = connection.Query<User>(
"SELECT UserId AS id, UserName AS name FROM Users",
(reader, values) => new User((int)values[0], (string)values[1])
);
对于高频、全局使用的私有构造类型,可注册自定义 TypeHandler<t></t>,或借助 IDynamicParameters + 表达式树预编译构造逻辑。但这属于优化手段,日常开发中较少需要。
基本上就这些。核心要点是:优先用 [Dapper.Constructor] 标记 + 字段名对齐;不行就手写 map 函数。Dapper 不会自动“破解”私有构造,但给了足够灵活的入口让你可控地介入构造过程。
以上就是Dapper如何映射到私有构造函数的类 Dapper private constructor映射的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号