Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Automapper将实体映射到另一个具有更多属性的实体时出错_C#_Automapper - Fatal编程技术网

C# 使用Automapper将实体映射到另一个具有更多属性的实体时出错

C# 使用Automapper将实体映射到另一个具有更多属性的实体时出错,c#,automapper,C#,Automapper,我正在尝试将一个实体映射到另一个具有类似属性的实体,但我希望在我的“目标类型”中有更多的字段。 我想映射一个实体,该实体使用源类的空字段的目标值,并且我不想在我的源类型上映射所有字段 请看下面的示例: [TestClass] public class Example { public class Person { public string FirstName { get; set; } public string LastName { get; set; }

我正在尝试将一个实体映射到另一个具有类似属性的实体,但我希望在我的“目标类型”中有更多的字段。 我想映射一个实体,该实体使用源类的空字段的目标值,并且我不想在我的源类型上映射所有字段

请看下面的示例:

[TestClass]
public class Example
{
  public class Person
  {
      public string FirstName { get; set; }
      public string LastName { get; set; }
      public int? Foo { get; set; }
  }

  public class DPerson
  {
      public string FirstName { get; set; }
      public string LastName { get; set; }
      public int? Foo { get; set; }
      public bool IsUser { get; set; }
  }

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

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

      Assert.IsNotNull(destinationPerson);
      Assert.AreEqual(1, destinationPerson.Foo);
      Assert.AreEqual(true, destinationPerson.IsUser);
  }
} 
[TestClass]
公开课范例
{
公共阶层人士
{
公共字符串名{get;set;}
公共字符串LastName{get;set;}
公共int?Foo{get;set;}
}
公共类个人
{
公共字符串名{get;set;}
公共字符串LastName{get;set;}
公共int?Foo{get;set;}
公共bool IsUser{get;set;}
}
[测试方法]
公共void TestNullIgnore()
{
Mapper.CreateMap()
.ForAllMembers(opt=>opt.Condition(srs=>!srs.IsSourceValueNull));
var sourcePerson=新用户
{
FirstName=“比尔”,
LastName=“盖茨”,
};
var destinationPerson=新的用户
{
FirstName=“”,
LastName=“”,
Foo=1,
IsUser=true
};
Mapper.Map(sourcePerson,destinationPerson);
Assert.IsNotNull(destinationPerson);
断言.AreEqual(1,destinationPerson.Foo);
Assert.AreEqual(true,destinationPerson.IsUser);
}
} 
当我在DPerson类中添加IsUser属性时,AutoMapper抛出一个奇怪的异常“AutoMapper.AutoMapperMappingException”,并且在它的消息中说不可能映射“Person->Boolean”

如果我删除“.ForAllMembers(opt=>opt.Condition(srs=>!srs.IsSourceValueNull))”配置,它会工作,但我在Foo属性中得到了“null”

我采用了这个问题第一个答案的代码:

有人能帮我吗

干杯。

错误消息很奇怪,但在这种特殊情况下,
IsSourceValueNull
不起作用是有道理的。由于
IsUser
的类型为bool,因此其值永远不能为
null

这意味着,当AutoMapper为该属性计算
IsSourceValueNull
时,它每次都会为
IsUser
属性计算“false”。然后,它尝试映射
IsUser
属性,但失败了

解决此问题的一种方法是显式忽略
IsUser
属性:

Mapper.CreateMap<Person, DPerson>()
    .ForMember(dest => dest.IsUser, opt => opt.Ignore())         
    .ForAllMembers(opt => opt.Condition(srs => !srs.IsSourceValueNull));
Mapper.CreateMap()
.ForMember(dest=>dest.IsUser,opt=>opt.Ignore())
.ForAllMembers(opt=>opt.Condition(srs=>!srs.IsSourceValueNull));

我说这很奇怪,因为在异常中编写的消息听起来像API试图将我的类映射到bool值,这是因为我认为它很奇怪,顺便说一下,当我指定条件时。对于所有成员(opt=>opt.Condition(srs=>!srs.IsSourceValueNull))我假设我正在设置源类“IsSourceValueNull”和源类(Person)中的字段,所有字段都可以为Null。我仍然认为这应该奏效。不管怎样,这是我第一个使用AutoMapper的项目,我只是在假设。你能这样做来检查类型吗?假设你想得到双倍,但偶尔你会得到字符串。你想跳过它或者设置为0.0