Dapper 默认不支持只写属性映射,因其在反序列化前通过 PropertyInfo.CanRead 过滤属性,跳过无 get 的属性;虽 SetValue 支持赋值,但前期元数据筛选已排除。

Dapper 默认不支持只写属性(即只有 set、没有 get 的属性)的映射,因为它在反序列化时需要通过属性的 set 方法赋值,但同时也依赖反射获取属性元数据——而标准 .NET 反射对纯只写属性的支持有限,尤其在旧版 Dapper(如 2.0 之前)中会直接跳过这类属性,导致映射失败或静默忽略。
Dapper 在执行查询后,使用 PropertyInfo.SetValue() 给目标对象赋值,这一步本身能接受只写属性。但问题出在前期:它会先调用 PropertyInfo.CanRead 判断是否为可读属性,默认过滤掉 CanRead == false 的属性。所以即使你写了 set,只要没 get,Dapper 就不会把它纳入映射字段列表。
get 返回默认值或 throw,只要存在且可访问,Dapper 就能识别。例如:public string Name { get => throw new NotSupportedException(); set { _name = value; } }
Dictionary<string object></string>,再手动给只写属性赋值。适合少量字段或初始化场景。ITypeMap 实现:重写 GetMember(string columnName),主动返回只写属性的 PropertyInfo,并确保 CanRead 不作为硬性过滤条件。需继承 SqlMapper.ITypeMap 并注册:SqlMapper.SetTypeMap(typeof(MyDto), new MyCustomTypeMap());
对于 Insert 或 Update 操作,Dapper 仅用 PropertyInfo.GetValue() 提取参数值,这时只写属性因无法 GetValue 会报错或传 null。所以只写属性不应出现在 Insert/Update 的参数对象中。正确做法是:
基本上就这些。Dapper 的设计哲学偏向“约定优于配置”,对非常规结构支持有限,只写属性属于边缘场景,优先调整模型设计比硬扛映射更可持续。
以上就是Dapper怎么处理只写属性 Dapper Write-Only Property映射的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号