首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >AutoMapper.Map忽略源对象中的所有空值属性

AutoMapper.Map忽略源对象中的所有空值属性
EN

Stack Overflow用户
提问于 2012-09-20 21:49:03
回答 5查看 25.9K关注 0票数 25

我正在尝试映射两个相同类型的对象。我想做的是使用AutoMapper来加载源对象中具有Null值的所有属性,并保留目标对象中的现有值。

我试过在我的“仓库”中使用它,但它似乎不起作用。

代码语言:javascript
运行
复制
Mapper.CreateMap<TEntity, TEntity>().ForAllMembers(p => p.Condition(c => !c.IsSourceValueNull));

可能的问题是什么?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-09-21 10:27:59

很有趣,但您最初的尝试应该是可行的。下面的测试是绿色的:

代码语言:javascript
运行
复制
using AutoMapper;
using NUnit.Framework;

namespace Tests.UI
{
    [TestFixture]
    class AutomapperTests
    {

      public class Person
        {
            public string FirstName { get; set; }
            public string LastName { get; set; }
            public int? Foo { get; set; }
        }

        [Test]
        public void TestNullIgnore()
        {
            Mapper.CreateMap<Person, Person>()
                    .ForAllMembers(opt => opt.Condition(srs => !srs.IsSourceValueNull));

            var sourcePerson = new Person
            {
                FirstName = "Bill",
                LastName = "Gates",
                Foo = null
            };
            var destinationPerson = new Person
            {
                FirstName = "",
                LastName = "",
                Foo = 1
            };
            Mapper.Map(sourcePerson, destinationPerson);

            Assert.That(destinationPerson,Is.Not.Null);
            Assert.That(destinationPerson.Foo,Is.EqualTo(1));
        }
    }
}
票数 31
EN

Stack Overflow用户

发布于 2017-07-14 16:13:08

使用3个参数的Condition重载让您将表达式等同于示例p.Condition(c => !c.IsSourceValueNull)

方法签名:

代码语言:javascript
运行
复制
void Condition(Func<TSource, TDestination, TMember, bool> condition

等价表达式:

代码语言:javascript
运行
复制
CreateMap<TSource, TDestination>.ForAllMembers(
    opt => opt.Condition((src, dest, sourceMember) => sourceMember != null));
票数 11
EN

Stack Overflow用户

发布于 2012-09-20 22:13:51

到目前为止,我已经解决了这个问题。

代码语言:javascript
运行
复制
foreach (var propertyName in entity.GetType().GetProperties().Where(p=>!p.PropertyType.IsGenericType).Select(p=>p.Name))
   {
      var value = entity.GetType().GetProperty(propertyName).GetValue(entity, null);
      if (value != null)
      oldEntry.GetType().GetProperty(propertyName).SetValue(oldEntry, value, null);
    }

但仍希望找到使用AutoMapper的解决方案

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12514084

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档