加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 如何配置Automapper 4以允许空目标值

发布时间:2020-12-15 20:59:02 所属栏目:百科 来源:网络整理
导读:我在解决如何使Automapper 4.2.1允许类型映射时遇到一些问题,其中目标值可能为null,具体取决于源值. 较旧版本的Automapper允许通过Mapper配置设置AllowNullDestination标志,但是我找不到新版本的等效配方,并且通过静态Mapper对象配置的旧机制似乎已经过时.
我在解决如何使Automapper 4.2.1允许类型映射时遇到一些问题,其中目标值可能为null,具体取决于源值.

较旧版本的Automapper允许通过Mapper配置设置AllowNullDestination标志,但是我找不到新版本的等效配方,并且通过静态Mapper对象配置的旧机制似乎已经过时.

我试过以下没有成功:

> Mapper.Configuration.AllowNullDestinationValues = true;
> Mapper.AllowNullDestinationValues = true;
> Mapper.Initialize(c => c.AllowNullDestinationValues = true);

这是一个简单的测试案例,展示了这个问题.由于Substitute方法返回null,因此在AutoMapperMappingException的最后一行失败.我希望两个映射都能成功.

我宁愿避免在解决方案中使用.ForMember,因为在我试图解决的真实场景中,bool和’object'(实际上是一个自定义类)之间的映射应该应用于整个对象树.

虽然StackOverflow上有几个类似的问题,但我还没有找到一个引用最新版Automapper的问题.

在此先感谢您的任何建议

using AutoMapper;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace AutoMapperTest
{
    [TestClass]
    public class ExampleTest
    {
        [TestMethod]
        public void NullDestinationCanBeMapped()
        {
            var mapper = new MapperConfiguration(configuration =>
            {
                configuration.CreateMap<Source,Target>();
                //How should the following mapping be modified to pass the test?   
                configuration.CreateMap<bool,object>()
                .Substitute(i => i ? null : new object());
            }).CreateMapper();

            var target1 = mapper.Map<Source,Target>(new Source {Member = false}); //succeeds
            Assert.IsNotNull(target1.Member); //pass
            var target2 = mapper.Map<Source,Target>(new Source {Member = true}); //fails to map with exception
            Assert.IsNull(target2.Member); //not reached
        }
    }

    public class Source
    {
        public bool Member { get; set; }
    }

    public class Target
    {
        public object Member { get; set; }
    }
}

解决方法

而不是使用替换,使用ConvertUsing …

configuration.CreateMap<bool,MyClass>()
     .ConvertUsing(i => i ? null : new object());

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读