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

AutoMapper 9配置报错:如何获取IEnumerable<Profile>传入AddProfiles

解决AutoMapper中AddProfiles无法接受Assembly参数的问题

这个问题是因为AutoMapper的API在新版本中做了调整——AddProfiles方法不再直接接受Assembly参数,而是要求传入IEnumerable<Profile>类型的集合。你可以通过扫描程序集并手动实例化所有Profile子类来解决这个问题,具体修改如下:

修改你的AutoMapperFactory类,添加扫描并实例化Profile类型的逻辑:

public static class AutoMapperFactory {
    public static IConfigurationProvider CreateMapperConfiguration() {
        var config = new MapperConfiguration(cfg => {
            var assembly = Assembly.GetAssembly(typeof(AutoMapperFactory));
            
            // 从目标程序集中筛选出所有非抽象的Profile子类
            var profileTypes = assembly.GetTypes()
                .Where(t => typeof(Profile).IsAssignableFrom(t) 
                            && !t.IsAbstract 
                            && !t.IsInterface);
            
            // 实例化这些Profile类型,转换为Profile集合
            var profiles = profileTypes
                .Select(type => Activator.CreateInstance(type))
                .Cast<Profile>();
            
            cfg.AddProfiles(profiles);
            cfg.IgnoreAllUnmapped();
        });
        return config;
    }
}

代码逻辑说明:

  • assembly.GetTypes():获取目标程序集中的所有类型
  • Where过滤条件:确保只保留继承自Profile、非抽象类且不是接口的类型(这些是可以实例化的Profile实现类)
  • Activator.CreateInstance(type):通过反射创建每个Profile类型的实例
  • Cast<Profile>():将实例转换为Profile类型,形成符合要求的IEnumerable<Profile>集合

如果你的Profile类存在需要参数的构造函数,上面的方式会失败,这种情况下你可以根据实际情况调整实例化逻辑(比如使用依赖注入容器来创建实例)。但对于大多数无参构造函数的Profile场景,上面的代码就可以完美解决问题。

内容的提问来源于stack exchange,提问作者Andrew

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:39:13