AutoMapper配置测试时动态传递类型参数问题求解
问题原因
C#泛型方法的类型参数必须在编译阶段确定,你通过TestCase传入的toType是运行时才会被解析的Type实例,无法直接传入Map<toType>()作为泛型参数——toType.GetType()返回的是RuntimeType类型,显然也不是你要映射的目标类型,自然没法正常工作。
解决方案
AutoMapper原生提供了非泛型版本的Map重载,专门用于运行时动态指定映射类型的场景,不需要用反射构造泛型方法,直接调用即可:
[TestCase(typeof(Team), typeof(TeamDTO))] [TestCase(typeof(TeamManager), typeof(TeamManagerDTO))] public void AutoMapperTests(Type toType, Type fromType) { // 若被测类型没有无参构造函数,可手动构造测试实例替代Activator.CreateInstance var fromObject = Activator.CreateInstance(fromType); // 调用非泛型重载,依次传入源对象、源类型、目标类型 var toObject = mapper.Map(fromObject, fromType, toType); // 调整断言顺序,先判空再校验类型,避免空引用异常 Assert.NotNull(toObject); Assert.That(toObject.GetType(), Is.EqualTo(toType)); }
补充说明:如果一定要用泛型版Map方法,也可以通过反射在运行时构造泛型方法调用,但这种写法冗余且有额外性能开销,完全没有必要,优先用官方提供的非泛型重载即可。
内容的提问来源于stack exchange,提问作者Conway Stern
相关产品推荐
相关产品推荐

