Dapper如何映射到私有构造函数的类 Dapper private constructor映射

幻夢星雲
发布: 2025-12-16 05:01:14
原创
158人浏览过
Dapper 默认不支持私有构造函数映射,但可通过 [Dapper.Constructor] 特性(推荐,需 v2.0+)或 Query(sql, map: ...) 手动构造实现;参数名须与 SQL 字段名严格匹配,或通过委托显式调用私有构造函数。

dapper如何映射到私有构造函数的类 dapper private constructor映射

Dapper 默认不支持直接映射到具有私有构造函数的类,因为它依赖于反射创建实例,而私有构造函数在没有显式指定时通常不会被调用(尤其当存在公有无参构造函数时)。但你可以通过几种方式让 Dapper 正确映射到私有构造函数的类。

使用带有参数的私有构造函数 + [Dapper.Constructor] 特性(推荐)

Dapper 从 v2.0 开始支持 [Dapper.Constructor] 特性,用于标记你希望 Dapper 在构造对象时调用的构造函数。只要该构造函数参数名与查询字段名(或别名)匹配,Dapper 就能自动绑定并调用它。

  • 确保引用的是 Dapper ≥ 2.0(如 Dapper 2.1.24 或更高)
  • 在目标构造函数上添加 [Dapper.Constructor]
  • 参数名需与 SQL 查询中的列名(或别名)严格一致(区分大小写取决于数据库和设置)
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");
登录后复制

手动指定映射:使用 Query(sql, map: ...) 重载

如果你无法修改类(比如是第三方类型),或想完全控制映射逻辑,可以用 Dapper 的 map 参数手动构造对象。

秀脸FacePlay
秀脸FacePlay

一款集成AI换脸、照片跳舞等多种AI特效玩法的App

秀脸FacePlay 124
查看详情 秀脸FacePlay
  • 传入一个 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])
);
登录后复制

配合 Expression 构造器或自定义 TypeHandler(进阶)

对于高频、全局使用的私有构造类型,可注册自定义 TypeHandler<t></t>,或借助 IDynamicParameters + 表达式树预编译构造逻辑。但这属于优化手段,日常开发中较少需要。

  • 自定义 TypeHandler 主要用于值类型或特殊序列化场景,对私有构造类帮助有限
  • 更实用的做法是封装一个扩展方法,统一处理某类私有构造模型的映射

基本上就这些。核心要点是:优先用 [Dapper.Constructor] 标记 + 字段名对齐;不行就手写 map 函数。Dapper 不会自动“破解”私有构造,但给了足够灵活的入口让你可控地介入构造过程。

以上就是Dapper如何映射到私有构造函数的类 Dapper private constructor映射的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号