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
相关产品推荐
相关产品推荐

