

新闻资讯
技术学院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("SELECT Id, Name FROM Users");
如果你无法修改类(比如是第三方类型),或想完全控制映射逻辑,可以用 Dapper 的 map 参数手动构造对象。
Func 显式读取字段并调用私有构造函数var users = connection.Query( "SELECT UserId AS id, UserName AS name FROM Users", (reader, values) => new User((int)values[0], (string)values[1]) );
对于高频、全局使用的私有构造类型,可注册自定义 TypeHandler,或借助 IDynamicParameters + 表达式树预编译构造逻辑。但这属于优化手段,日常开发中较少需要。
基本上就这些。核心要点是:优先用 [Dapper.Constructor] 标记 + 字段名对齐;不行就手写 map 函数。Dapper 不会自动“破解”私有构造,但给了足够灵活的入口让你可控地介入构造过程。