MapsterMapper映射含internal构造函数的类时找不到构造函数如何解决?
解决方案
首先明确问题根因:Mapster默认仅支持使用公共无参构造函数实例化目标类型,同时默认不会访问internal级别的属性setter,因此会触发构造函数不匹配的编译错误。以下是几种符合你需求的可行方案:
方案1:配置Mapster支持访问非公共成员(改造成本最低)
你可以直接在你的库内部配置Mapster的映射规则,因为库代码和EntityModel处于同一程序集,可以直接访问internal成员,配置示例如下:
// 全局配置开启访问非公共成员,如果你仅想针对单个类型配置可以不用全局改 TypeAdapterConfig.GlobalSettings.Default.IgnoreNonPublicMembers = false; // 针对EntityModel单独指定使用internal构造函数 TypeAdapterConfig<JsonModel, EntityModel> .NewConfig() // 直接指定构造逻辑,因为在同一程序集可以访问internal构造 .ConstructUsing(src => new EntityModel());
配置完成后再调用jsonModel.Adapt<EntityModel>()即可正常映射,同时外部项目因为没有访问internal构造的权限,依然无法自行实例化EntityModel。
方案2:使用静态工厂方法封装实例化逻辑(可控性更高)
你可以为EntityModel添加internal级别的静态工厂方法,再配置Mapster使用工厂方法创建实例:
public class EntityModel { public int Prop { get; internal set; } public int Prop2 { get; internal set; } internal EntityModel() { } // 新增internal静态工厂方法 internal static EntityModel Create() => new EntityModel(); }
对应的Mapster配置:
TypeAdapterConfig<JsonModel, EntityModel> .NewConfig() .ConstructUsing(_ => EntityModel.Create());
这种方式更便于你后续统一管控实例创建逻辑,也完全符合禁止外部实例化的要求。
方案3:对外暴露只读接口(安全性最高)
如果你想完全杜绝外部操作实体的可能,可以拆分公共接口和内部实现:
// 对外暴露的公共接口,只有只读属性 public interface IEntityModel { int Prop { get; } int Prop2 { get; } } // 内部实现类,不对外暴露构造 internal class EntityModel : IEntityModel { public int Prop { get; set; } public int Prop2 { get; set; } }
你库内部的映射直接针对EntityModel实现,对外返回的都是IEntityModel类型,外部完全看不到实现类,自然也无法自行实例化,同时不需要调整Mapster的默认配置。
内容的提问来源于stack exchange,提问作者Jensyl
相关产品推荐
相关产品推荐

