You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 20:24:02